当前位置: > shell编程 >

shell语法

时间:2015-05-11 03:49来源:linux.it.net.cn 作者:IT

1、 set命令
当没有参数的时候,列出系统中所有的自定义变量值;当有参数的时候,重置基本参数如$1、$2等。如set `date` 将date命令的输出当作输入参数;

2、let命令
执行算术运算。功能如i=j+1,shell语法为:
let “i=$j+1”,等同于 ‘expr’。 后者只能作用于整数,如 i=`expr $i+1`; 如果使用非整数,退出状态不为0

3、expr
expr也有模式匹配功能。
可以使用expr通过指定冒号选项计算字符串中字符数。.*意即任何字符重复0次或多次。
$value=accounts.doc
$expr $value : ‘.*’
输出:12
在expr中可以使用字符串匹配操作,这里使用模式. d o c抽取文件附属名。
$expr $value : ‘\(.*\).doc’ 在圆括号前加转义符号是表示圆括号是用于提取功能的。
输出:accounts

4、shift命令
将参数表向左移动一个位置,$2变成$1,…,依次类推。

5、shell中可以嵌套命令,使用\`来保护内层命令,如`cd \`pwd\“。

6、设置IFS为换行符:IFS=’
’(还真得换行)

7、两个特殊操作
命令1 && 命令2 :只有在命令1执行成功时才执行命令2;
命令1 || 命令2 :命令1失败才执行命令2;

8、变量赋值
“”引用的字符串需要shell解析其中的“、$、\等特殊字符,而’’引用的字符串则被看作完全的
字符串,echo ‘`pwd`’将输出`pwd`;而echo “`pwd`”将输出当前目录;

变量

含义

$var Var的值,若无定义则无值
${var} 同上,用于同$varx等类型变量区分
${var-thing} Var有定义时,取值$var;无定义时取值thing,而$var不变
${var=thing} Var有定义时,取值$var;无定义时取值thing$var值设为thing
${var?message} 有定义时取值$var;否则打印message并退出shell,若message为空串,打印var:parameter not set
${var+thing} 有定义时取值thing;否则无值

9、shell内部变量

变量

含义

$# 参数个数
$* 所有参数
$@ 同上,稍有区别
$- Shell的选择项
$? 上次执行命令返回值
$$ Shell的进程标识符
$! 用&启动的最后一个命令的进程标识符
$HOME cd命令的缺省参数
$IFS 参数分割词的字符表
$MAIL 信件文件,当其改变时给出信息you have mail
$PATH 搜索命令的目录表
$PS1 提示符串,缺省为$
$PS2 后继命令行提示符,缺省为>

有关$*和$@得归纳:
$*和$@扩展为参数,并被重复扫描;参数得空格将字符串分成多个参数;
$*表示shell文件的所有参数及其空格连在一起作为单个词处理;
$@与shell文件接收的参数等价,参数中的空格被忽略,其结果是等同于原来参数的一个单词列表。

10、 shell模式匹配规则
* 匹配任意字符串,包括空字符串
? 匹配任意单字符串
[ABC] 匹配ABC中任意字符
“…” 完全与…匹配,引号保护特殊字符,也可以写成’…’
\C 匹配C

11、 case语句
case word in
模式1) 命令;;
模式2) 命令;;

*) 命令[;;]
esac

只能匹配一个模式

12、 if 语句
if 命令
then
else
fi

其中换行很重要,then、else和fi仅在换行或分号之后被识别,else部分可选。可以利用case语句替代if和test测试语句,对于test命令不是内部命令的情况下,case语句执行的要快;

13、循环
1)
for i [in 文件(参数)列表]
do
循环体
done
如果i后面没有in部分,则隐含地表示对shell文件的全部参数,即$*

2)
while 命令
do
循环体,只要命令返回状态为真便继续进行
done

3)
until 命令
do
循环体,只要命令返回状态为假便继续执行
Done

例如:
while sleep 60
do

Done

每隔60秒执行一次循环中的操作;

另外,where处的控制命令可以是true、false、或者是:,冒号命令是一个shell内部命令,仅仅计算参数值,然后返回“真”,但是它不需要调用系统中的命令,所以效率比true命令高;

4)break命令:退出循环,取自C语言。

14、点号命令:
将文件作为标准输入,从中读入一行一行的命令在当前shell中执行,不要求文件具有可执行权限;

15、 文件命令习惯,后面加上当前进程号码$$为好

16、标准输入命令read
$read greeting
Hello,world

$echo $greeting
Hello,world

定义了一个变量为:
file=/dir1/dir2/dir3/my.file.txt
${file#*/} # 去掉第一条 / 及其左边的字串:dir1/dir2/dir3/my.file.txt
${file##*/} # 去掉最后一条 / 及其左边的字串:my.file.txt
${file#*.} # 去掉第一个 . 及其左边的字串:file.txt
${file##*.} # 去掉最后一个 . 及其左边的字串:txt
${file%/*} # 去掉最后条 / 及其右边的字串:/dir1/dir2/dir3
${file%%/*} # 去掉第一条 / 及其右边的字串:(空值)
${file%.*} # 去掉最后一个 . 及其右边的字串:/dir1/dir2/dir3/my.file
${file%%.*} # 去掉第一个 . 及其右边的字串:/dir1/dir2/dir3/my
# # 是去掉左边(在键盘上 # 在 $ 之左边)
# % 是去掉右边(在键盘上 % 在 $ 之右边)
# 单一符号是最小匹配﹔两个符号是最大匹配



(责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容