1、在shell中关于命令行参数的几个使用方法:
$#:表示命令行中有多少个参数
$0:表示调用程序的名称,也就是命令名称
$[1~9]:表示命令行中相应的参数(1~9);而对于超过10个参数的时候,对相应参数的引用应该加上花括号。也就是如果要 对第12个参数进行引用的话就要采用${12}这种表达方式。
$@:表示命令行所有的参数,例如命令 ls -l testfile,则$@表示"-l testfile"
$*:表示命令行的所有参数。
对于$@和$*的不同就在于他们加上双引号的时候"$@"将命令行参数还是按照多个参数进行表示,而"$*"是将命令行参数合并成一个进行表示。例如:命
令 cat -a1 -a2
-a3,则"$@"表示的是三个参数($1=-a1,$2=-a2,$3=-a3),而"$*"表示的是一个参数($1="-a1 -a2 -a3")。
$$:表示该进程所对应的PID
$!:表示后台进程的PID。
$?:表示的是上一个命令执行的状态(0表示正常结束,非0表示异常结束)
shift:左移命令行参数,也就是将命令行的参数向左移动。第1个参数($1)被丢弃,第2个参数($2)编程第1个参数($1), 第3个参数编程第2个参数……。也可以给shift加一个参数n表示从n位置开始进行左移。
set:命令初始化命令行参数。set命令把set后面跟的一个或几个参数赋值给位置参数,这些位置参数以$1打头。例如:
set this is it就是为位置参数$1,$2,$3赋值为$1=this,$2=is,$3=it。
:-:使用默认值。修饰符:-使用一个默认的值来替代那些空的或者没有赋值的变量。例如:${name:-default}表示当变量name没有赋值的时候用default来替代name,但是变量name并没有改变
:=:为变量赋默认值。:-不能改变变量的值,但是:=却可以。例如:${name:=default}表示当变量那么没有赋值的时候用default来替代name,同时name赋值为default。
:?:显示错误信息。例如${name:?message}表示当变量name没有赋值的时候,提示错误信息message。
::shell脚本中常常用冒号(:)后面跟扩展表示符(:=)来给任意一个空变量或者为赋值的变量赋值。冒号命令通常给命令行上其后的符号赋值而不会去执行后面的命令。假如在一行的前面没有冒号提示符,shell就会赋值并试图执行来自赋值语句的命令。
2、在shell编程中怎么改变参数变量的方法:
在shell编程中,有时候需要改变命令行的参数,或者需要获取在shell程序中获取其他命令的运行结果信息。那么就可以使用下面的方法来获取。
例如:要在shell程序中获取一个文件的链接数目,那么可以采用下面的命令
set -- $(ls -l "$filename")
linkcnt=$2
上
面的命令表示重新设置命令行参数列表(也即重新设置$1~$9),其中set后面的--表示忽略以-开头的参数信息(也即如果开头是-的话,也把它当作一
个普通字符,而非一个参数连接符)。接着括号里面命令ls 表示列出文件filename的相关信息。用ls列出文件的信息如下:
[root@localhost ~]# ls -l in.txt
-rw-r--r-- 1 root root 130 06-25 18:24 in.txt
其中第一项是文件的执行权限信息,第二项是连接数……
然后再通过set命令和$()引用ls执行的结果,那么新的参数表就变成了如下
$1:-rw-r--r--
$2:1 (文件的连接数)
$3:root
$4:root
$5:130
...
所以通过上面的命令就可以将文件filename的连接数保存在$2中。
而下面的例子是将文件的inode节点号保存在$1中
set $(ls -i "filename")
用typeset可以将一个参数设置为局部参数。
注意:在采用上面方法重置命令行参数的时候要将原来的参数保存起来,不然会被新的结果冲掉
shell中的字符串匹配
bash提供了可操作路径名字符串以及其他字符串的类型陪陪操作符。这些操作符可以从字符串的前缀或者后缀中删去字符串,4个字符串匹配操作符如表所示:
______________________________________________
操作符 | 功能 |
----------------------------------------------|
# | 去除最小匹配前缀 |
----------------------------------------------|
## | 去除最大前缀匹配 |
----------------------------------------------|
% | 去除最小匹配后缀 |
----------------------------------------------|
%% | 去除最大匹配后缀 |
----------------------------------------------
这些操作字符的语法形式如下:
${varname op pattern }
这里op是上表列出的4个操作字符中的一个,pattern是一个匹配类型,它一般和文件名很相似。这些操作符一般用来操作路径名,以便提取或者移除某些组件,或者用来改变后缀:
$ SOURCEFILE=/usr/local/src/prog.c
$ echo ${SOURCEFILE#/*/}
local/src/prog.c
最小匹配前缀就是从第一个/之后的字符往后找,因为是*号,所以匹配所有字符,一直找到第二个/,最后剩下字符串local/src/prog.c
$ echo ${SOURCEFILE##/*/}
prog.c
最大匹配前缀就是从第一个/往后找,因为是*符号,所以匹配所有字符,一直找到最后一个/,最后剩下字符串prog.c
$ echo ${SOURCEFILE%/*}
/usr/local/src
最小匹配后缀就是从后往前找,找到第一个匹配的字符串序列/prog.c
$ echo ${SOURCEFILE%%/*}
输出为空,因为最大匹配后缀就是从第一个/后面开始匹配的整个字符串。
可以用以下方法来获得字符串name的字符个数(长度)
${#name}
在对字符串进行处理的时候可以不加符号$来引用位置参数。例如
${#1}
表示参数1的长度。
而${1%/*}可以表示一个参数1所代表的路径的父目录是否存在。
用
info bash builtin命令可以列出所有的bash内置命令。
File: bash.info, Node: Builtin Index, Next: Reserved Word Index, Prev: Copying This Manual, Up: Top
Index of Shell Builtin Commands
*******************************
* Menu:
* .: Bourne Shell Builtins.
(line 16)
* :: Bourne Shell Builtins.
(line 11)
* [: Bourne Shell Builtins.
(line 212)
* alias: Bash Builtins. (line 11)
* bg: Job Control Builtins.
(line 7)
* bind: Bash Builtins. (line 21)
* break: Bourne Shell Builtins.
(line 29)
* builtin: Bash Builtins. (line 92)
* caller: Bash Builtins. (line 100)
* cd: Bourne Shell Builtins.
(line 36)
* command: Bash Builtins. (line 117)
* compgen: Programmable Completion Builtins.
(line 10)
* complete: Programmable Completion Builtins.
(line 28)
* continue: Bourne Shell Builtins.
(line 55)
* declare: Bash Builtins. (line 136)
* dirs: Directory Stack Builtins.
(line 7)
* disown: Job Control Builtins.
(line 83)
* echo: Bash Builtins. (line 191)
* enable: Bash Builtins. (line 243)
* eval: Bourne Shell Builtins.
(line 63)
* exec: Bourne Shell Builtins.
(line 70)
* exit: Bourne Shell Builtins.
(line 82)
* export: Bourne Shell Builtins.
(line 88)
* fc: Bash History Builtins.
(line 10)
* fg: Job Control Builtins.
(line 16)
* getopts: Bourne Shell Builtins.
(line 103)
* hash: Bourne Shell Builtins.
(line 145)
* help: Bash Builtins. (line 271)
* history: Bash History Builtins.
(line 39)
* jobs: Job Control Builtins.
* kill: Job Control Builtins.
(line 57)
* let: Bash Builtins. (line 280)
* local: Bash Builtins. (line 287)
* logout: Bash Builtins. (line 297)
* popd: Directory Stack Builtins.
(line 37)
* printf: Bash Builtins. (line 301)
* pushd: Directory Stack Builtins.
(line 58)
* pwd: Bourne Shell Builtins.
(line 163)
* read: Bash Builtins. (line 326)
* readonly: Bourne Shell Builtins.
(line 172)
* return: Bourne Shell Builtins.
(line 187)
* set: The Set Builtin. (line 9)
* shift: Bourne Shell Builtins.
(line 200)
* shopt: Bash Builtins. (line 387)
* source: Bash Builtins. (line 618)
* suspend: Job Control Builtins.
(line 94)
* test: Bourne Shell Builtins.
(line 212)
* times: Bourne Shell Builtins.
(line 278)
* trap: Bourne Shell Builtins.
(line 283)
* type: Bash Builtins. (line 622)
* typeset: Bash Builtins. (line 653)
* ulimit: Bash Builtins. (line 659)
* umask: Bourne Shell Builtins.
(line 324)
* unalias: Bash Builtins. (line 737)
* unset: Bourne Shell Builtins.
(line 341)
* wait: Job Control Builtins.
(line 73)
(line 25)