Linux命令行与Shell脚本编程大全读书笔记
Linux内核4大主要功能:内存管理进程管理设备管理文件系统管理Linux系统启动的进程和脚本管理1./etc/inittab 管理系统开机时会自动启动的进程2./etc/init.d 管理开机时启动或停止某个应用的脚本放在这个目录下,/etc/rcX.d目录在启动时,所有加载的脚本都是init.d下脚本的link
Linux内核4大主要功能:
内存管理
进程管理
设备管理
文件系统管理
Linux系统启动的进程和脚本管理
1./etc/inittab 管理系统开机时会自动启动的进程
2./etc/init.d 管理开机时启动或停止某个应用的脚本放在这个目录下,/etc/rcX.d目录在启动时,所有加载的脚本都是init.d下脚本的link
Linux 命令集合
1.ipcs -m 查看系统上的当前共享内存页面
2.cp -R dir1 dir2: 递归的复制dir1到dir2
cp -f test* dir2:将所有以test开头的文件复制到dir2,-f参数用来强制覆盖dir2目录中已有的同名文件,而不会提示用户
cp -a old/. new/:将old目录下的所有文件拷贝到new,包括隐藏文件
cp -l test1 test4: 创建了test1的硬链接文件test4,实际上二者标示的是同一个文件,因二者的节点号是相同的
cp -s test1 test5:创建了test1的软链接文件test5。链接文件只要存储源文件的信息,并不需要存储源文件中的数据
ln -s test1 test5 ln -l test1 test4 可以达到和上述类似的效果
- rm -rf dir2:删除dir2目录及其子目录和文件
- stat test1:查看文件统计信息
- file test1:查看文件类型,包括ASCII文本文件;Shell脚本文件;二进制可执行文件
- cat -n 1.txt 查看1.txt的内容,且给文本的每行加上行号
cat -b 1.txt 与上述指令的区别,只在文本非空白行加上行号
cat -s 1.txt 压缩文本中连续的多个空白行为一个空白行
more 1.tx 查看文本文件的内容,空格键可以翻页; 回车键可以显示下一行
- ps -aux:可以查看当前系统所有进程的详细信息
ps l: 查看当前控制台下属于当前用户的进程信息
可以在上述指令后增加参数 - -forest,可以看到进程之间的启动关系
进程信息中STAT列含义如下:
<:该进程运行在高优先级
N:该进程运行在低优先级
L:该进程有页面锁定在内存中
s:该进程是个控制进程
l:该进程是多线程的
+:该进程运行在前端
- top指令设置刷新间隔为2秒: top -d 2
- df -h: 显示某个设备上还有多少磁盘空间
- du -h: 显示某一个目录下各个子目录的空间
- printenv:打印当前shell所在的全局变量
- set:显示为某个特定进程设置的所有环境变量(包括全局变量)
- export 变量名:可以导出当前的局部变量成为全局变量 如:export test
- 变量定义注意事项:环境变量名称、等号和值之间没有空格;如果赋值一个含有空格的字符串,必须用单引号将字符串扩起来
15. unset:删除环境变量,如:unset test. 注意:在shell子进程中unset的全局环境变量,在父进程中该环境变量依然有效。
- PATH:定义了命令行输入命令的搜索路径。
- /etc/profile 是每个shell启动时,默认的主启动文件
- 每个用户的shell启动脚本,有如下三者中的一种:$HOME/.bash_profile $HOME/.bash_login $HOME/.profile 这三个文件会加载$HOME目录下的.bashrc的启动脚本,.bashrc会加载/etc目录下的bashrc文件,同时$/HOME/.bashrc可以作为用户自定义脚本执行的地方。
- alias -p 可以查看已有的命令别名列表
- 查看Flash分区信息:cat /proc/mtd(显示分区名称、大小) cat /proc/partition(显示block)
- 在shell中显示提示而不换行,如:echo -n “This is a test string: ”
- 在shell中显示$符号,需要按照转义处理。如:echo “test print \$15”
- 在shell中使用反引号,可以获取命令的输出结果,然后赋值给一个变量。如:test=`date` test变量内容即为date的输出
- IFS:内部字段分隔符,该环境变量定义了bash shell用作字段分隔符的一系列字符。可以如下方式使用该变量:
IFS.OLD=$IFS
IFS=$’\n’
<……use the new IFS value in code>
IFS=$IFS.OLD
- $*变量:把所有参数当成一个参数,而不是多个参数; $@变量:会单独处理每个参数,所有参数当做同一字符串中的多个独立的单词
- 最后一个参数的表现方式:
params=$#
echo the last parameter is $params
echo the last parameter is ${!#}
- 使用$和方括号将数学表达式圈起来:var1=$[1+(2*5)]
- bc:浮点计算器
- $?: 该变量用来保存上个执行命令的退出状态码,退出码0,表示命令成功结束;非0,表示命令异常结束
- exit:该命令可以在shell结束时,指定一个退出状态码。该值取值范围0~255,如果指定返回大于255,会被系统自动取模后的结果,作为退出状态码
- if-then语句格式一:
if command
then
commands
fi
- if-then语句格式二(在command之后增加一个分号):
if command: then
commands
fi
- if-then-else格式:
if command
then
commands
else
commands
fi
- 嵌套if( elif )
if command1
then
commands
elif command2
then
commands
fi
- test:上述if的条件判断都是根据命令的执行退出状态码来执行,如果想执行条件判断,需要使用test命令,或者使用[ ]
- if条件判断命令格式一:
if test condition
then
commands
fi
- if条件判断命令格式二:
if [ condition ]
then
commands
fi
- test命令可以判断3类条件:数值比较、字符串比较、文件比较
- test数值比较功能:
n1 -eq n2 检查n1是否等于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小(在使用时,需要对于符号转义,如:if [ $val1 \< $val2 ])
str1 > str2 检查str1是否比str2大(在使用时,需要对于符号转义,如:if [ $val1 \> $val2 ])
-n str1 检查str1的长度是否大于0
-z str1 检查str1的长度是否为0
注:在test命令中,大写字母会小于小写字母,这是因为test使用标准ASCII顺序,即小写字母的ASCII值会大于大写字母的ASCII值
sort命令排序时,小写字母的会排在前面
- test文件较功能:
-d file 检查file是否存在并且是一个目录
-e file 检查file是否存在
-f file 检查file是否存在并且是一个文件
-s file 检查file是否存在并且非空
-r file 检查file是否存在并且可读
-w file 检查file是否存在并且可写
-x file 检查file是否存在并且可执行
-O file 检查file是否存在并属于当前用户所有
-G file 检查file是否存在并与当前用户有相同的组
file1 -nt file2 检查file1是否比file2新
file1 -ot file2 检查file1是否比file2旧
-b file 若文件存在且是一个块特殊文件,则为真
-c file 若文件存在且是一个字符特殊文件,则为真
-d file 若文件存在且是一个目录,则为真
-e file 若文件存在,则为真
-f file 若文件存在且为一个规则文件,则为真
-g file 若文件存在且设置了SGID位的值,则为真
-h file 若文件存在且为一个符号链接,则为真
-k file 若文件存在且设置了“sticky”位的值,则为真
-p file 若文件存在且为一已命名管道,则为真
-s file 若文件存在且其大小大于零,则为真
-u file 若文件存在且设置了SUID位的值,则为真
-r file 若文件存在且可读,则为真
-w file 若文件存在且可写,则为真
-x file 若文件存在且可执行,则为真
-o file 若文件存在且被有效用户ID所拥有,则为真
$# 是传给脚本的参数个数
$0 是脚本本身的名字
$1 是传递给该shell脚本的第一个参数
$2 是传递给该shell脚本的第二个参数 (注意:对于多过9个参数,需要在数字周围加花括号,如第10个参数: ${10})
$@ 是传给脚本的所有参数的列表
$* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
$$ 是脚本运行的当前进程ID号
$? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误
$-记录着当前设置的shell选项
- 复合条件测试:
[ condition1 ] && [ condition2 ] 只有在 && 左边的命令返回真(命令返回值 $? == 0),&&右边的命令才会被执行
[ condition1 ] || [ condition2 ]
- test使用标准数学运算符
if (( $val1 ** 2 > 90)) 双括号中的特殊字符,如 < 和 > 不再需要转义,就可以直接使用了
- 双括号中命令符号
val++ 后增
val- - 后减
++val 先增
- -val 先减
** 幂运算
<< 左移位
>> 右移位
&& 逻辑与
|| 逻辑或
! 逻辑非
& 位与
| 位或
~ 位求反
- test使用字符串模式匹配比较
if [[ $USER == r* ]] $USER环境变量是否是以字母r开头的
- case命令
case variable in
pattern1 | pattern2)
commands1;;
pattern3)
commands2;;
*)
default commands;;
esac
- for命令
for var in list
do
commands
done
- for命令中使用通配符
for file in /home/rich/test/*
do
echo “test file $file”
done
- C语言风格for命令
for (( i=1; i <= 10; i++))
do
echo “test…”
done
- while 命令
while test command
do
other commands
done
如:
while [ $val1 -gt 0]
do
echo $val1
var1=$[$var1 - 1]
done
注意:while命令允许你在while语句行定义多个测试命令,但只有最后一个测试命令的退出状态码会被用来决定什么时候结束循环
51.until 命令
until test command
do
other commands
done
注意:until命令要求你指定一个通常输出非零退出码的测试命令。(非零,表示测试条件尚不成立)
52.break 跳出多重循环
break n
这里n 说明了要跳出的循环层级。默认情况下,n为1,表明跳出的是当前的循环。
如果将n 设置为2,break命令就会停止下一级的外部循环
- continue 继续循环
continue n
这里n 定义了要继续的循环层级。
如 continue 2 表示跳出当前循环,继续外层的循环
54.要在shell脚本的参数值中包含空格,需要把有空格的参数用单引号或双引号括起来
55.basename命令会只返回程序名而不包括路径
如: name=`basename $0`
56.shift 命令
默认情况下,这个命令会将命令前移,如,变量$3的值会移到$2
shift的好处:不知道参数个数,可以利用shift指令,只操作第一个参数$1,只需要在循环中每次shift,同时判断$1是否为空(while [ -n “$1” ])
shift n
表明要移动几个位置,如shift 2 : 移动2个位置
注意:当使用shift时,一个参数被移除后,它的值会被丢掉,且无法恢复
57.getopt 命令
处理命令行选项和参数时非常方便的工具
格式:
getopt options optstring parameters
options:如 -q选项,可以在命令执行时忽略错误信息
optstring:是这个过程的关键,定义了命令行有效的选项字母,还定义了那些选项字母需要参数值。每个需要参数的选项字母后加一个冒号。
例如:
getopt -q ab:cd -a -b test1 -c -d test2 test3
执行结果:-a -b test1 -c -d - - test2 test3
这里- - 表示分开行中的额外参数
- getopts 命令
getopt的命令中,选项字母的参数值是不能有空格的,而 getopts就可以解决该问题
格式:
getopts opstring variable
opstring: 有效字母都会列在其中,如果选项字母要求有个参数,就加一个冒号。要去掉错误消息,可以在opstring之前加一个冒号。
例如:
getopts :ab:c -a -b “test1 test2“ -c
59.read命令
(1)基本的读取
例如1:
echo -n “Enter you name: ” -n 选项会移除掉字符串末尾的换行符,允许用户紧跟其后输入数据
read name 读取的数据存储到$name中了
例如2:
read -p “please enter you age: ” age -p选项,允许你直接在read命令行中指定提示字符,读取的数据存储到 $age
(2)超时处理
例如1:
read -t 5 -p “please enter you name: ” name -t选项指定了read命令等待输入的秒数
例如2:
read -n1 -p “Do you want to continue [Y/N] ?” answer -n1选项,表明read读取单个字符后退出
(3)隐藏读取(多用于密码)
read -s -p “Enter you password: ” pass -s选项,阻止将数据显示在显示器上,实际上只是将输入文本颜色设置成和背景色一样罢了
(4)从文件中读取
cat test | while read line 将从cat的 test文件内容,每次read都读取一行,将一行内容存储到变量$line
60.查看系统的所有线程
(1)ps -T
(2)top之后输入h,可以查看各个线程对于CPU的占用
61.重定向描述符
例如1:同时重定向错误和数据
ls -al test test2 test3 2>test6 1>test7
重定向错误到test6;重定向输出到test7
例如2:重定向输入
cat < testfile
强制cat命令接收来自非STDIN的文件的输入
62.重定向输出和错误 &>
例如:
ls -al test test2 test3 &> test7
将ls的结果,包括可能的错误输出都重定向到文件test7中
63.临时重定向输出到错误STDERR >&2
例如:
echo “This is an error” >&2
64.永久重定向 exec命令
在shell脚本中,使用exec命令,永久重定向shell执行期间的特定描述符
例如1:脚本中重定向输出
exec 1>testout
exec命令会启动一个新shell并将STDOUT文件描述符重定向到文件。脚本中所有发给STDOUT的输出,都会被重定向到testout文件中
例如2:脚本中重定向输入
exec 0< testfile
这个命令告诉shell它应该从文件testfile中获得输入,而不是STDIN
65.阻止命令输入,重定向到/dev/null
这种情况,在脚本运行在后台时很常见。shell输入到null的任何数据都不会保存,这些数据都被丢掉了。
例如1:
ls -al > /dev/null
例如2:阻止任何错误都不保存
ls -al badfile test6 2> /dev/null
例如3:>/dev/null 2>&1
shell中可能经常能看到:>/dev/null 2>&1
命令的结果可以通过%>的形式来定义输出
/dev/null 代表空设备文件
> 代表重定向到哪里,例如:echo "123" > /home/123.txt
1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"
2 表示stderr标准错误
& 表示等同于的意思,2>&1,表示2的输出重定向等同于1
那么本文标题的语句:
1>/dev/null 首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。
2>&1 接着,标准错误输出重定向等同于 标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。
66.快速移除现有文件数据
输入重定向时,将/dev/null作为输入文件。由于/dev/null文件不含有任何内容,程序员通常用它来快速移除现有文件中的数据,而不用先删除再创建文件。
例如:
cat /dev/null > testfile
文件testfile仍然存在系统上,但现在它是空文件。
67.mktemp命令
在/tmp目录下创建临时文件
例如1:创建本地临时文件
mktemp testing.XXXXXX
mktemp命令会用6个字符码替换这6个X,从而保证文件名在目录中是唯一的。
例如2:创建临时文件时,返回全路径
tempfile = `mktemp -t tmp.XXXXXX`
后续可以在任何目录下,通过tempfile来引用新创建的临时文件了,因此时获知了全路径
例如3:创建临时目录
tempdir =`mktemp -d dir.XXXXXX`
后续可以再tempdir这个临时目录下创建自己的临时文件。
68.tee命令
将输入一边发送到显示器,一边发送到tee命令指定的文件中
例如1:
date | tee testfile
date的执行结果,既显示在屏幕上,又存储到文件testfile中
例如2:tee追加存储
date | tee -a testfile
想testfile中追加新的date的数据。没有-a选项,则每次执行tee,都会覆盖文件的内容
69.信号处理
SIGHUP 挂起进程,当终端断开时,将发送该信号给终端控制进程
SIGINT 终止进程(ctrl + c)终端驱动程序将发送该信号给前台进程组
SIGQUIT 停止进程(ctrl + \)该信号将发往前台进程组,并生成可用于调试的核心转储文件。在进程陷入死循环时,可以触发该信号调试
SIGKILL 无条件终止进程
SIGTERM 可能的话终止进程 kill和killall命令所发送的默认信号。
SIGSTOP 无条件停止进程,但不是终止进程
SIGTSTP 停止或暂停进程,但不终止进程(ctrl + z) 作业控制的停止信号,发送信号给前台进程组,使其停止运行。
SIGCONT 继续运行停止的进程
shell默认情况下,会忽略收到的 SIGQUIT和 SIGTERM信号。正因为这样,交互式shell才不会被意外终止。
用户有时会使用kill -KILL 或者killall -9 显式向进程发送SIGKILL信号。然而这一做法通常是错误的。精心的设计应用程序应当为SIGTERM信号设置处理器程序,以便于其能够预先清除临时文件和释放其他资源,从而全身而退。
发送SIGKILL信号可以杀掉某个进程,从而绕开了SIGTERM信号的处理程序。因此,总是应该首先尝试使用SIGTERM信号来终止进程,而把SIGKILL信号作为最后手段,去对付那些不响应SIGTERM信号的失控进程
SIGKILL 和 SIGSTOP信号,是一个必执行信号。处理器程序无法将其阻塞、忽略或者捕获,故而总能成功执行。
- shell中捕捉信号
trap commands signals
例如:
trap “echo ‘Sorry!I have trapped Ctrl-C’” SIGINT SIGTERM
trap在每次检测到SIGINT或 SIGTERM信号时显示一行简单的文本消息。
一般trap 指令放置在shell执行的正文第一行,在捕捉到信号后,自动执行。
- grep命令
grep -q -e "No medium found" -e "No such file or directory"
说明:
-q:安静模式,不打印任何标准输出。如果有匹配的内容则立即返回状态值0。
-e:并列使用多个 -e参数可以实现或条件,同时查询多个条件,满足其中之一即可。
72.函数
(1)函数定义两种形式:
function name {
commands
}
name( ){
commands
}
(2)函数的返回值
情况一:
函数中最后一条命令的退出状态码,作为函数的退出状态码
情况二:
return 命令来退出函数并返回特定的退出状态码
注:函数的退出状态码必须小于256,大于256将返回一个错误
(3)函数的输出保存到shell变量中
如:result=`testfunc`
这条命令将testfunc函数的输出付给$result变量。
这种方法,可以用来从函数返回大于256的返回值,只需要在函数的最后用echo将结果输出即可。
如:echo $[$value * 2]
(4)函数中使用变量
情况一:
向函数传递变量,bash shell会将函数当做小脚本来对待。
如:
value=`addfunc 10 15`
向函数addfunc传递了两个参数10和15
情况二:
由于函数使用特殊参数环境变量作为自己的参数值,它不能直接从脚本的命令行获取脚本的参数值。即脚本的参数如$1,与函数的$1不同。
情况三:全局变量和局部变量
在shell脚本中任何地方定义的变量都是全局变量;
在函数内部使用local声明的变量,都是局部变量。
例如:local temp
- shell中的${},##和%%的使用
假设我们定义了一个变量为:
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
记忆的方法为:
# 是 去掉左边(键盘上#在 $的左边)
%是去掉右边(键盘上% 在$ 的右边)
单一符号是最小匹配;两个符号是最大匹配
${file:0:5}:提取最左边的 5个字节:/dir1
${file:5:5}:提取第 5个字节右边的连续5个字节:/dir2
也可以对变量值里的字符串作替换:
${file/dir/path}:将第一个dir替换为path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:将全部dir替换为 path:/path1/path2/path3/my.file.txt
利用 ${ } 还可针对不同的变数状态赋值(沒设定、空值、非空值):
${file-my.file.txt} :假如 $file沒有设定,則使用 my.file.txt作传回值。(空值及非空值時不作处理)
${file:-my.file.txt} :假如 $file 沒有設定或為空值,則使用 my.file.txt作傳回值。 (非空值時不作处理)
${file+my.file.txt} :假如 $file設為空值或非空值,均使用 my.file.txt作傳回值。(沒設定時不作处理)
${file:+my.file.txt} :若 $file 為非空值,則使用 my.file.txt作傳回值。 (沒設定及空值時不作处理)
${file=my.file.txt} :若 $file沒設定,則使用 my.file.txt作傳回值,同時將 $file賦值為 my.file.txt。(空值及非空值時不作处理)
${file:=my.file.txt} :若 $file 沒設定或為空值,則使用 my.file.txt作傳回值,同時將 $file賦值為my.file.txt。 (非空值時不作处理)
${file?my.file.txt} :若 $file沒設定,則將 my.file.txt輸出至 STDERR。 (空值及非空值時不作处理)
${file:?my.file.txt} :若 $file 没设定或为空值,则将 my.file.txt输出至 STDERR。 (非空值時不作处理)
${#var} 可计算出变量值的长度:
${#file} 可得到 27,因为/dir1/dir2/dir3/my.file.txt是27个字节
Shell重定向&>file、2>&1、1>&2的区别
0表示标准输入
1表示标准输出
2表示标准错误输出
> 默认为标准输出重定向,与 1> 相同
2>&1 意思是把 标准错误输出 重定向到 标准输出.
&>file 意思是把 标准输出 和 标准错误输出 都重定向到文件file中
shell中可能经常能看到:>/dev/null 2>&1
命令的结果可以通过%>的形式来定义输出
/dev/null 代表空设备文件
> 代表重定向到哪里,例如:echo "123" > /home/123.txt
1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"
2 表示stderr标准错误
& 表示等同于的意思,2>&1,表示2的输出重定向等同于1
那么本文标题的语句:
1>/dev/null 首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息。
2>&1 接着,标准错误输出重定向等同于 标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。
/dev/null 的用途
/dev/null ,从名称上可以很显然看出是一个空文件(写入到/dev/null时全部丢失,读取/dev/null时自己返回EOF),那么你会很疑惑,他到底有什么用途呢,请看下文听我讲解,可能你在很多脚本里看过 /dev/null,具体总结下几种常见用途.
一、禁止标准输出.
eg:
cat $filename >/dev/null
# 文件内容丢失,不会输出到标准输出,.
二、禁止标准错误
eg:
rm $badname 2>/dev/null
#删除文件错误时,不会再有提示到终端,都丢到/dev/null里去了
三、禁止标准输出和标准错误的输出.
eg1:
cat $filename 2>/dev/null >/dev/null
# 如果"$filename"不存在,将不会有任何错误信息提示.
# 如果"$filename"存在, 文件的内容不会打印到标准输出.
# 因此, 上面的代码根本不会输出任何信息.
# 当只想测试命令的退出码而不想有任何输出时非常有用。
eg2:
#-----------测试命令的退出 begin ----------------------#
ls dddd 2>/dev/null 8
echo $? //输出命令退出代码:0为命令正常执行,1-255为有出错。
#-----------测试命令的退出 end-----------#
cat $filename &>/dev/null
四、清除日志文件内容
eg:
cat /dev/null > /var/log/messages
# : > /var/log/messages 有同样的效果, 但不会产生新的进程.(因为:是内建的)
cat /dev/null > /var/log/wtmp
五、 隐藏cookie而不再使用
eg:
if [ -f ~/.netscape/cookies ] # 如果存在则删除.
then
rm -f ~/.netscape/cookies
fi
ln -s /dev/null ~/.netscape/cookies
# 现在所有的cookies都会丢弃而不会保存在磁盘上了.
linux中shell变量$#,$@,$0,$1,$2的含义解释:
变量说明:
$$
Shell本身的PID(ProcessID)
$!
Shell最后运行的后台Process的PID
$?
最后运行的命令的结束代码(返回值)
$-
使用Set命令设定的Flag一览
$*
所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$@
所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n"的形式输出所有参数。
$#
添加到Shell的参数个数
$0
Shell本身的文件名
$1~$n
添加到Shell的各参数值。$1是第1参数、$2是第2参数…。
【shell】常用语法 -b file -c file -f file-d file -x file
【shell】常用语法 -b file -c file -f file-d file -x file
一、test条件判断
1,test文件测试:
-b file 若文件存在且是一个块特殊文件,则为真
-c file 若文件存在且是一个字符特殊文件,则为真
-d file 若文件存在且是一个目录,则为真
-e file 若文件存在,则为真
-f file 若文件存在且为一个规则文件,则为真
-g file 若文件存在且设置了SGID位的值,则为真
-h file 若文件存在且为一个符号链接,则为真
-k file 若文件存在且设置了“sticky”位的值,则为真
-p file 若文件存在且为一已命名管道,则为真
-s file 若文件存在且其大小大于零,则为真
-u file 若文件存在且设置了SUID位的值,则为真
-r file 若文件存在且可读,则为真
-w file 若文件存在且可写,则为真
-x file 若文件存在且可执行,则为真
-o file 若文件存在且被有效用户ID所拥有,则为真
2,test字符串比较
-z string 若string长度为0,则为真
-n string 若string长度不为0,则为真
string1 = string2 若两个字符串相等,则为真
string1 != string2 若两个字符串不相等,则为真
3,test命令的数字比较操作符
int1 -eq int2 若int1等于int2,则为真
int1 –ne int2 若int1不等于int2,则为真
int1 –lt int2 若int1小于int2,则为真
int1 –le int2 若int1小于等于int2,则为真
int1 –gt int2 若int1大于int2,则为真
int1 –ge int2 若int1大于等于int2,则为真
4,test复合表达式
! expr 若expr为假则复合表达式为真。expr可以是任何有效的测试表达式
expr1 -a expr2 若expr1和expr2都为真,则为真
expr1 -o expr2 若expr1和expr2有一个为真,则为真
二、shell里的特殊变量
# sh /usr/local/bkeep/shell.sh 001 002
I'm $0 is:/usr/local/bkeep/shell.sh //正在被执行脚本的名字;`basename $0`
I'm $1 is:001 //$1接收到的参数
I'm $2 is:002 //$2接收到的参数
I'm $# is:2 //总共接收到的参数个数
I'm $* is:001 002 //把接收到的参数全部打印出来
I'm $@ is:001 002 //同上
I'm $? is:0 //上一个脚本的退出状态“0”代表正常;“1”非正常退出
I'm $$ is:24137 //当前执行脚本的进程ID
I'm $! is: //前一个后台进程的id
三:其他
1.返回值 #?
cd dir
echo "$?"
如果dir存在,则返回0,不存在则返回1.其他函数的命令也是一样,比如diff,等等。
每个命令都会返回一个 exit 状态(有时候也叫return状态).成功返回0,如果返回一个非0值,通
常情况下都会被认为是一个错误码.一个编写良好的UNIX命令,程序,和工具都会返回一个0作为
退出码来表示成功,虽然偶尔也会有例外.
同样的,脚本中的函数和脚本本身都会返回退出状态.在脚本或者是脚本函数中执行的最后的命
令会决定退出状态.在脚本中,exit nnn命令将会把nnn 退出码传递给shell
$?读取最后执行命令的退出码.函数返回后,$?给出函数最后执行的那条命令的退出码.这种给
函数返回值的方法是 Bash 的方法.对于脚本来说也一样.总之,一般情况下,0为成功,非0失败W
2 .
$ 变量替换操作符
只有在变量被声明,赋值,unset或exported 或者是在变量代表一个signal的时候,
变量才会是以本来的面目出现在脚本里.变量在被赋值的时候,可能需要使用"=",
read状态或者是在循环的头部.
在""中还是会发生变量替换,这被叫做部分引用,或叫弱引用.而在''中就不会发生变
量替换,这叫做全引用,也叫强引用.这两个符合在同一个按键上。具体见第5章的讨论.
注意:$var 与${var}的区别,不加{},在某些上下文将引起错误,为了安全,使用2.
还有一个按键在左上角,即按键1的左边。此按键有下面的作用。即将ls -l的结果传给a
17 a=`ls -l` # 把ls -l的结果给a
18 echo $a # 别忘了,这么引用的话,ls的结果中的所有空白部分都没了(包括换行)
19 echo
20 echo "$a" # 这么引用就正常了,保留了空白
或者直接
echo "$(ls -l)" 也可以取出目录
3.
在read 命令状态中
30 echo -n "Enter \"a\" "
31 read a
32 echo "The value of \"a\" is now $a."
33
34 echo
35
这个方法可以接受键盘输入到a中。
4.
在一个双引号中直接使用变量名,一般都是没有问题的.它阻止了所有在引号中的特殊字符的
重新解释--包括变量名[2]--但是$,`和\除外.[3]保留$,作为特殊字符的意义,是为了能够在双
引号中也能够正常地引用变量("$var").这样在""中可以使用变量所表达的值(Example 4-1).
使用""来防止单词分割.[4]如果在参数列表中使用双引号,将使得双引号中的参数作为一个参
数.即使双引号中的字符串包含多个单词(也就是包含空白部分),也不会变为多个参数,如:
1 variable1="a variable containing five words"
2 COMMAND This is $variable1 # COMMAND 将以7 个参数来执行
3 # "This" "is" "a" "variable" "containing" "five" "words"
4
5 COMMAND "This is $variable1" # COMMAND 将以1 个参数来执行
5.赋值的方法
--------------------------------------------------------
a:C风格的赋值
7 (( a = 23 )) # 给一个变量赋值,从"="两边的空格就能看出这是c风格的处理.
8 echo "a (initial value) = $a"
9
10 (( a++ )) # 变量'a'后加1,C风格.
11 echo "a (after a++) = $a"
12
13 (( a-- )) # 变量'a'后减1,C风格.
14 echo "a (after a--) = $a"
------------------------------------------------
37(( t = a<45?7:11 )) # C 风格的3 元操作.
38 echo "If a < 45, then t = 7, else t = 11."
39 echo "t = $t " # Yes!
---------------------------------------------------
18 LIMIT=10
19
20 for ((a=1; a <= LIMIT ; a++)) # Double parentheses, and "LIMIT" with no "$".
20 for ((a=1; a <= LIMIT ; a++)) # 双圆括号, 并且"LIMIT"变量前边没有 "$".
21 do
22 echo -n "$a "
23 done
--------------------------------------------
b:let
4 a=2334 # 整型
5 let "a += 1" #不加双引号也可以
6 echo "a = $a " # a = 2335
--------------------------------------------------------------------
c:取变量
5 a=2334
6 a=$(($a+1))
7 echo "$a" #a=2335
—————————————————————
更多推荐
所有评论(0)