基本shell编程【1】
” 和 “” 的区别:前者中的字符串被视为纯文本,后者中的特殊字符会被识别,变量会被替换,例如echo “$a”,后者会打印出a的value。
shell的第一行必须是#!/bin/bash (以bash为例,还有其他的shell)。这么做的脚本可以直接以命令行执行./myscript 。 否则需要成为sh的参数,sh myscript。
#表示注释,除了#!(上面讲了)
语句后不需要分号。
- shell脚本中的系统变量
$0 这个程序的执行名字
$n 这个程序的第n个参数值,n=1…9
$* 这个程序的所有参数
$# 这个程序的参数个数
$$ 这个程序的PID
$! 执行上一个背景指令的PID
$? 上一个指令的返回值
$n 这个程序的第n个参数值,n=1…9
$* 这个程序的所有参数
$# 这个程序的参数个数
$$ 这个程序的PID
$! 执行上一个背景指令的PID
$? 上一个指令的返回值
- shell脚本中的括号
上图:date是一个命令。out是一个变量
![](http://images0.cnblogs.com/blog/528720/201305/17164050-ef44d7c6c14745fead4d1f7956b7bd08.jpg)
总结: $是取值的意思,${a} $a表示取变量,$(a)表示取命令的执行结果。 ${#a}表示取变量的长度。
表示命令的执行结果,有两种方式:使用 `expr 1 + 2 ` 或是$(expr 1 + 2)
表示数学运算,可以直接使用 $[ 1 + 2 ] 或是 $(( 1 + 2 )) 或是 let a=1+2 (注意空格!!!!)
上面这句话的意思是a=1 和a = 1的含义是不同的,这对于高级语言的编码人员来讲有点难适应,一般white space都是没有意义的,至少我之前是这么认为。
- 赋值
a=1 注意空格
a=$(ls /home)
- 伟大的if
一段脚本真正有点用处最离不开的是if。
![](http://images0.cnblogs.com/blog/528720/201305/17164140-e29253a046144d488a4fb5569ca50dfa.png)
接下来开始讲条件,常用的如下:
文件比较运算符
-e filename 如果 filename 存在,则为真 [ -e /var/log/syslog ]
-d filename 如果 filename 为目录,则为真 [ -d /tmp/mydir ]
-f filename 如果 filename 为常规文件,则为真 [ -f /usr/bin/grep ]
-L filename 如果 filename 为符号链接,则为真 [ -L /usr/bin/grep ]
-r filename 如果 filename 可读,则为真 [ -r /var/log/syslog ]
-w filename 如果 filename 可写,则为真 [ -w /var/mytmp.txt ]
-x filename 如果 filename 可执行,则为真 [ -L /usr/bin/grep ]
filename1 -nt filename2 如果 filename1 比 filename2 新,则为真 [ /tmp/install/etc/services -nt /etc/services ]
filename1 -ot filename2 如果 filename1 比 filename2 旧,则为真 [ /boot/bzImage -ot arch/i386/boot/bzImage ]
字符串比较运算符 (请注意引号的使用,这是防止空格扰乱代码的好方法)
-z string 如果 string 长度为零,则为真 [ -z "$myvar" ]
-n string 如果 string 长度非零,则为真 [ -n "$myvar" ]
string1 = string2 如果 string1 与 string2 相同,则为真 [ "$myvar" = "one two three" ]
string1 != string2 如果 string1 与 string2 不同,则为真 [ "$myvar" != "one two three" ]
算术比较运算符
num1 -eq num2 等于 [ 3 -eq $mynum ]
num1 -ne num2 不等于 [ 3 -ne $mynum ]
num1 -lt num2 小于 [ 3 -lt $mynum ]
num1 -le num2 小于或等于 [ 3 -le $mynum ]
num1 -gt num2 大于 [ 3 -gt $mynum ]
num1 -ge num2 大于或等于 [ 3 -ge $mynum ]
-e filename 如果 filename 存在,则为真 [ -e /var/log/syslog ]
-d filename 如果 filename 为目录,则为真 [ -d /tmp/mydir ]
-f filename 如果 filename 为常规文件,则为真 [ -f /usr/bin/grep ]
-L filename 如果 filename 为符号链接,则为真 [ -L /usr/bin/grep ]
-r filename 如果 filename 可读,则为真 [ -r /var/log/syslog ]
-w filename 如果 filename 可写,则为真 [ -w /var/mytmp.txt ]
-x filename 如果 filename 可执行,则为真 [ -L /usr/bin/grep ]
filename1 -nt filename2 如果 filename1 比 filename2 新,则为真 [ /tmp/install/etc/services -nt /etc/services ]
filename1 -ot filename2 如果 filename1 比 filename2 旧,则为真 [ /boot/bzImage -ot arch/i386/boot/bzImage ]
字符串比较运算符 (请注意引号的使用,这是防止空格扰乱代码的好方法)
-z string 如果 string 长度为零,则为真 [ -z "$myvar" ]
-n string 如果 string 长度非零,则为真 [ -n "$myvar" ]
string1 = string2 如果 string1 与 string2 相同,则为真 [ "$myvar" = "one two three" ]
string1 != string2 如果 string1 与 string2 不同,则为真 [ "$myvar" != "one two three" ]
算术比较运算符
num1 -eq num2 等于 [ 3 -eq $mynum ]
num1 -ne num2 不等于 [ 3 -ne $mynum ]
num1 -lt num2 小于 [ 3 -lt $mynum ]
num1 -le num2 小于或等于 [ 3 -le $mynum ]
num1 -gt num2 大于 [ 3 -gt $mynum ]
num1 -ge num2 大于或等于 [ 3 -ge $mynum ]
顺便提一下,条件除了被应用于if,还可以用于while。while的结构为
while 条件
do
echo “haha”
done