http://www.runoob.com/linux/linux-shell.html 教程地址
http://www.runoob.com/try/runcode.php?filename=helloworld&type=bash 在线编译器
笔记一:
如果不好理解的话,Shell 个人感觉可以对应成 win 中的 bat,通过代码来实现一些自动定时任务,自动备份或者执行的任务。
1、chmod +x file 加上执行权限,否则会提示无执行权限。
2、注意执行脚本时候或者全目录,或者 ./file.sh ,如果不加的话,linux 默认会从PATH 里去找该 file.sh。
3、看了这篇教程,发现脚本后缀名可以任意修改,仍然可以正常运行。
笔记二:
Linux 的字符串截取很有用。有八种方法。
假设有变量 var=http://www.aaa.com/123.htm
1. # 号截取,删除左边字符,保留右边字符。
echo ${var#*//}
其中 var 是变量名,# 号是运算符,*// 表示从左边开始删除第一个 // 号及左边的所有字符
即删除 http://
结果是 :www.aaa.com/123.htm
2. ## 号截取,删除左边字符,保留右边字符。
echo ${var##*/}
##*/ 表示从左边开始删除最后(最右边)一个 / 号及左边的所有字符
即删除 http://www.aaa.com/
结果是 123.htm
3. %号截取,删除右边字符,保留左边字符
echo ${var%/*}
%/* 表示从右边开始,删除第一个 / 号及右边的字符
结果是:http://www.aaa.com
4. %% 号截取,删除右边字符,保留左边字符
echo ${var%%/*}
%%/* 表示从右边开始,删除最后(最左边)一个 / 号及右边的字符
结果是:http:
5. 从左边第几个字符开始,及字符的个数
echo ${var:0:5}
其中的 0 表示左边第一个字符开始,5 表示字符的总个数。
结果是:http:
6. 从左边第几个字符开始,一直到结束。
echo ${var:7}
其中的 7 表示左边第8个字符开始,一直到结束。
结果是 :www.aaa.com/123.htm
7. 从右边第几个字符开始,及字符的个数
echo ${var:0-7:3}
其中的 0-7 表示右边算起第七个字符开始,3 表示字符的个数。
结果是:123
8. 从右边第几个字符开始,一直到结束。
echo ${var:0-7}
表示从右边第七个字符开始,一直到结束。
结果是:123.htm
注:(左边的第一个字符是用 0 表示,右边的第一个字符用 0-1 表示)
笔记三:
%d %s %c %f 格式替代符详解:
d: Decimal 十进制整数 – 对应位置参数必须是十进制整数,否则报错!
s: String 字符串 – 对应位置参数必须是字符串或者字符型,否则报错!
c: Char 字符 – 对应位置参数必须是字符串或者字符型,否则报错!
f: Float 浮点 – 对应位置参数必须是数字型,否则报错!
如:其中最后一个参数是 “def”,%c 自动截取字符串的第一个字符作为结果输出。
$ printf "%d %s %c\n" 1 "abc" "def"
1 abc d
笔记四:
$ command > file 2>&1
$ command >> file 2>&1
这里的&没有固定的意思
放在>后面的&,表示重定向的目标不是一个文件,而是一个文件描述符,内置的文件描述符如下
1 => stdout
2 => stderr
0 => stdin
换言之 2>1 代表将stderr重定向到当前路径下文件名为1的regular file中,而2>&1代表将stderr重定向到文件描述符为1的文件(即/dev/stdout)中,这个文件就是stdout在file system中的映射
而&>file是一种特殊的用法,也可以写成>&file,二者的意思完全相同,都等价于
>file 2>&1
此处&>或者>&视作整体,分开没有单独的含义
顺序问题:
find /etc -name .bashrc > list 2>&1
# 我想问为什么不能调下顺序,比如这样
find /etc -name .bashrc 2>&1 > list
这个是从左到右有顺序的
第一种
xxx > list 2>&1
先将要输出到stdout的内容重定向到文件,此时文件list就是这个程序的stdout,再将stderr重定向到stdout,也就是文件list
第二种
xxx 2>&1 > list
先将要输出到stderr的内容重定向到stdout,此时会产生一个stdout的拷贝,作为程序的stderr,而程序原本要输出到stdout的内容,依然是对接在stdout原身上的,因此第二步重定向stdout,对stdout的拷贝不产生任何影响
一些简单的测试代码:
#!/bin/bash
array_a=("aa" "bb" "cc" "dd")
echo ${array_a[1]}
echo ${array_a[@]}
for i in "${array_a[@]}";do
echo ${i}
done
aaa="aaa bbb ccc ddd"
echo `expr index "${aaa}" bbb`
val=`expr 3+8`
echo "两数之和为 : $val"
val=`expr 3 + 8`
echo "两数之和为 : $val"
a=10
b=20
if [ ${a}==${b} ]
then
echo "a等于b"
fi
if [ ${a}!=${b} ]
then
echo "a不等于b"
fi
read name
echo "$name It is a test"
echo `date`
echo -e "\n"
printf "\n"
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
a=5
b=6
result=$[a+b] # 注意等号两边不能有空格
echo "result 为: ${result}"
if test ${a} -ne ${b}
then
echo "a不等于b"
fi
a=10
b=20
if test $a -eq $b
then
echo "a 等于 b"
elif test $a -gt $b
then
echo "a 大于 b"
elif test $a -lt $b
then
echo "a 小于 b"
else
echo "没有符合的条件"
fi
i=1;
while(test ${i} -lt 6)
do
echo ${i}
let i++
done
demoFun(){
echo "first shell function!"
}
demoFun
funWithReturn(){
echo "这个函数会对输入的两个数字进行相加运算..."
echo "两个数字分别为 ${1} 和 ${2} !"
return $((${1}+${2}))
}
funWithReturn 3 6
echo "输入的两个数字之和为 $? !"