在创建shell文件时,必须在文件第一行指定要使用的shell,其格式为:
#!/bin/bash
例如:
Test_2 [~] 2015-10-12 22:51:57 root@pts/0 # cat test #!/bin/bash date Test_2 [~] 2015-10-12 22:52:05 root@pts/0 # ./test Mon Oct 12 22:52:11 GMT 2015
显示消息,如果在同一行显示一个文本字符串作为命令输出,可以用echo语句的 -n 参数:
Test_2 [/opt/shell] 2015-10-12 22:59:44 root@pts/0 # cat t1.sh #!/bin/bash echo -n "the time:";date Test_2 [/opt/shell] 2015-10-12 22:59:46 root@pts/0 # ./t1.sh the time:Mon Oct 12 22:59:51 GMT 2015
使用变量,反引号允许将shell命令的输出赋给变量:
Test_2 [/opt/shell] 2015-10-12 23:08:35 root@pts/0 # cat t1.sh #!/bin/bash time=`date +%Y%m%d-%H:%M:%S` ##用户变量$time echo "time is $time" echo "this is logged $USER" ##环境变量$USER Test_2 [/opt/shell] 2015-10-12 23:08:40 root@pts/0 # ./t1.sh time is 20151012-23:08:48 this is logged root
重定向输出与输入:
Test_2 [/opt/shell] 2015-10-12 23:11:31 root@pts/0 # date > file Test_2 [/opt/shell] 2015-10-12 23:11:42 root@pts/0 # cat file Mon Oct 12 23:11:42 GMT 2015 Test_2 [/opt/shell] 2015-10-12 23:11:45 root@pts/0 # w >> file ##双'>>'在文本后追加 Test_2 [/opt/shell] 2015-10-12 23:11:54 root@pts/0 # cat file Mon Oct 12 23:11:42 GMT 2015 23:11:54 up 1:26, 1 user, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 192.168.23.1 22:45 0.00s 0.21s 0.05s w Test_2 [/opt/shell] 2015-10-12 23:11:57 root@pts/0 # wc < file 4 32 225 ##wc命令对文本进行计数,行数、词数、字节数 Test_2 [/opt/shell] 2015-10-12 23:13:08 root@pts/0 # wc << eof ##以 eof开头 与 eof结尾 > test1 > test2 > test3 > eof 3 3 18 Test_2 [/opt/shell] 2015-10-12 23:15:08 root@pts/0 # cat file |grep root ##管道符号 root pts/0 192.168.23.1 22:45 0.00s 0.21s 0.05s w
if - then - else语句,不管命令是否成功,只有一个选择:
Test_2 [/opt/shell] 2015-10-12 23:27:01 root@pts/0 # cat t2.sh #!/bin/bash up="/etc/passwd" if grep wo $up ;then echo "user is mi" else echo "user is not mi" fi Test_2 [/opt/shell] 2015-10-12 23:27:06 root@pts/0 # ./t2.sh user is not mi
嵌套if,检查脚本代码中的多种条件,if - then - elif:
if command1;then command set 1 elif command2;then command set 2 elif command3;then command set 3 fi
test命令,提供了在if - then 语句中测试不同条件的途径:
if [ condition ];then commands fi
test命令可以判断3类条件:
数值比较;
字符串比较;
文件比较。
test命令的数值比较功能:
比较 | 描述 |
n1 -eq n2 | 检查是否相等 |
n1 -ge n2 | 检查n1是否大于或等于n2 |
n1 -gt n2 | 检查n1是否大于n2 |
n1 -le n2 | 检查n1是否小于或等于n2 |
n1 -lt n2 | 检查n1是否小于n2 |
n1 -ne n2 | 检查n1是否不等于n2 |
test命令的字符串比较功能:
比较 | 描述 |
str1 = str2 | 检查str1是否和str2相同 |
str1 != str2 | 检查str1是否和str2不同 |
str1 < str2 | 检查str1是否比str2小 |
str1 > str2 | 检查str1是否比str2大 |
-n str1 | 检查str1的长度是否非0 |
-z str1 | 检查str1的长度是否为0 |
说明:
不等的字符串条件也允许判断值是否相等,如:[ $USER != $yonghu ],标点与大小写也会比较;
大于小于符号必须转义,否则shell会当做重定向符号,如:[ $var1 \> $var2 ];
test命令中,大写字母会被当成小于小写字母的,另外,字符串比较用数学比较符(>、<、=),数值比较用文本代码(eq、gt、lt)。
test命令的文件比较功能:
比较 | 描述 |
-d file | 检查file是否存在并是一个目录 |
-e file | 检查file是否存在 |
-f file | 检查file是否存在并是一个文件 |
-r file | 检查file文件是否存在并可读 |
-s file | 检查file文件是否存在并非空 |
-w file | 检查file文件是否存在并可写 |
-x file | 检查file文件是否存在并可执行 |
-O file | 检查file文件是否存在并属当前用户所有 |
-G file | 检查file文件是否存在并且默认组与当前用户相同 |
file1 -nt file2 | 检查file1是否比file2新 |
file1 -ot file2 | 检查file1是否比file2旧 |
复合条件测试,即布尔逻辑组合测试,有两种:
[ condition1 ]&&[ condition2 ] | 使用and组合条件,两个条件都必须满足 |
[ condition1 ]||[ condition2 ] | 使用or组合条件,满足任意条件 |
if - then 的高级特性:
(( expression ))使用双圆括号可以是任意数学赋值或比较表达式
符号 | 描述 |
val++ | 后增 |
val-- | 后减 |
++val | 先增 |
--val | 先减 |
! | 逻辑求反 |
~ | 位求反 |
** | 幂运算 |
<< | 左位移 |
>> | 右位移 |
& | 位布尔和 |
| | 位布尔或 |
&& | 逻辑和 |
|| | 逻辑或 |
注意:不需要将双圆括号中表达式里的大于号转义
[[ expression ]]使用双方括号针对字符串比较,比test命令提供了另一特性-匹配模式[[ $USER == r* ]]
case命令,提供了一个更清晰的方法来为变量每个可能的值指定不同的选项:
Test_2 [/opt/shell] 2015-10-13 00:53:44 root@pts/0 # cat t4.sh #!/bin/bash numb="$1" ##脚本后边跟的第一个字符 case $numb in test) echo "this is test";; chai) echo "this is chai";; root) echo "this is root";; *) ##星号匹配没有列出的值 echo "thsi is null";; esac Test_2 [/opt/shell] 2015-10-13 00:53:51 root@pts/0 # ./t4.sh chai this is chai Test_2 [/opt/shell] 2015-10-13 00:54:02 root@pts/0 # ./t4.sh ssss thsi is null