shell 中基本语法与特殊变量
特殊变量
# :存放命令行参数的个数 $# 用于输出
ps:argc 不为0 至少从1开始
? :存放最后1条命令的返回码
*或者@ : 存放所有输入的命令行参数;这两个变量在linux中是等价的
特殊字符屏蔽(要将其作为一般字符使用)
"",'',和\ :'' > ""
()有特殊含义,注意它的转义(当成命令解释)
${} 变量的正规表达式
bash 对 ${} 定义了不少用法。以下是取自线上说明的表列
${parameter:-word} ${parameter:=word} ${parameter:?word} ${parameter:+word} ${parameter:offset} ${parameter:offset:length} ${!prefix*} ${#parameter} ${parameter#word} ${parameter##word} ${parameter%word} ${parameter%%word} ${parameter/pattern/string} ${parameter//pattern/string}
String:为空,表达式为真
-n String: 长度为非0 表达式为真
-z String: 长度为0 表达式为真
整数比较,文件属性判定
shift [n]
参数左移动n位
set [-option][arg...]
显示变量及其值,设置或者还原shell的属性,设置位置变量的值
不带任何参数显示目前系统中所有的变量名称和变量值
指定选项则可设置或还原你shell的属性
eg:
echo $1 $2 $3
set A B C D E
echo $1 $2 $3 $4 $5 $6 $7
<用法详解???>
关于参数列表
$?
$#
$0---$9
if (test expression) then # 还可if []... ???test 和 []的区别?? 可以 if ! [! ...] []中可以用-o 或者 -a (and)
commands
else
commands
fi
case语句中,可以使用匹配模式,就是前面说过的元字符匹配模式,而不是正则表达式的匹配
case string in
pattern_1) command1;; #pattern 可以为通配符,甚至是[] 命令
...
*) commands;;
esac
for loop_index in arg_list #省略in和arg_list时候,loop_index依次取$1 $2...
do
commands
done
while (test expression) 或者 while [ expression ]
do
commands
done
也可以这样
while echo "Input your choice"
read choice
do
。。。
done
# arg_list 允许使用通配符
( basename ) 剥出指定后缀 。basename filename .a (剥离掉.a的后缀)
shell 中的括号{ (和[
1.${var}
2.$(cmd)
3.()和{}
4.${var:-string},${var:+string},${var:=string},${var:?string}
5.$((exp))
6.$(var%pattern),$(var%%pattern),$(var#pattern),$(var##pattern)
7.test [] [[]]
1.Shell 中变量的原形 ${var}
它是Shell中变量的原形eg: echo ${var}abcd ; mv $filename ${filename}.$tail;这是批量改后缀名的句子
2.命令替换 $(cmd)
先执行cmd命令 再将命令后的标准输出放回到原来的位置,边成了 echo 标准输出
3.一串的命令执行() 和 {} 注意空格和分号
5.POSIX标准的扩展计算:$((exp))
eg:echo $((var++))
7. [[ 是 bash 程序语言的关键字
1>在 [[ 中使用 && 和 || ,[ 中使用 -a 和 -o 表示逻辑与和逻辑或
2>test和[]中可用的比较运算符只有==和!=,两者都是用于字符串比较的,不可用于整数比较,整数比较只能使用-eq, -gt这种形式
3>[ ] 中的长度有一定限制,如[ -z $(cat ./staff_db | grep -w “0000000001”) ]就会提示说[中参数过多,原因在于 staff_db的文件太大么? 写法不对 应该写成[ -z “$(cat ./staff_db | grep -w “0000000001”)” ] 那上面的会解释成什么呢?