x=5 #定义变量
$x #引用变量
echo $x #显示变量
"$PATH":/home/abc/software #变量拼接
#运算 :let [] (())
let no1++ ;
let no2+=3;
let result=no1+no2;
no2=$[ no2 + 1 ];
result1=$(( no1+no2+3 )); #推荐这种用法
declare -i xxx #将xxx 定义成integer
-x #将变量定义成环境变量。等同export var="abc"
#path
echo $PATH
#PS1
echo "$PS1,$PS2,$PS4"
$n : n 为数字,$0代表命令本身, $1-$9代表第一到第九个参数,如果十个以上的参数需要用大括号,如 ${10}.
$* : 这个变量代表命令行中的所有参数,$*把所有的参数年成一个整体。
$@ : 这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待。
$# : 这个变量代表命令行中参数的个数。
$? : 最后一次执行的命令的返回状。0为正确执行,非0为执行不正确。
$$ : 当前进程 的进程号(PID)
$! : 后台运行的最后一个进程的进程号(PID)
a=() #定义
a[0] = 5 #赋值
echo ${#a[@/*]} #读取a数组长度
${a[0]} #取数组内容,下标对应的值
${a[*]},${a[@]} #取数组全部内容。
${a[@]:0:3} #数组分片 ${a[@/*]:起始位置:长度}
${a[@]/helo/hello} #替换:${a[@/*]/查找字符/替换字符}
只有在bash 4.0 以上版本才有效(
bash --version
)
#定义
declare -A a=(["key1"]="hello" ["key2"]="world")
#赋值
a["key3"]="a bit difference"
#读取所有键
echo ${!a[*/@]}
#读取所有值
echo ${a[@/*]}
#根据键读取值
echo ${a[key3]}
#遍历数组(key和value)
for key in ${!a[@]}
do
echo "key=[$key];value=[${a[$key]}]"
done
echo ${PATH#/*:} #变量从左向右删除匹配的最短要求
echo ${PATH##/*:} #变量从左到右删除匹配的最长要求 (贪婪模式)
echo ${PATH%/*:} #变量从右到左删除匹配的最短要求
echo ${PATH%%/*:} #变量从右到左删除匹配的最长要求(贪婪模式)
echo ${PATH/home/HOME} #变量从左到右替换匹配的第一个
echo ${PATH//home/HOME} #变量从左到右替换所有匹配到的(贪婪模式)
#结构如下:
if [ 条件 ];then
#do something
fi
==注意:‘[’前后均必须加空格,变量如要保证为空及含空格的多个单词时不出错就要加双引号.==
if [ "$aa" = "aa" -a "$bb" = "bb" ] || [ "$cc" = "cc" -a "$dd" = "dd" ]; then
if [[ $1 != "" && $# -eq 1 ]]; then
数值判断
-eq (equal)
-ne (not equal)
-lt (less than)
-gt (grant than)
-ge (grant equal)
-le (less equal)
$A="aa" $?=0 $#=4
字符判断 -z (zero 空为真) -n (not 非空为真)
[ -z "" ] && echo "yes" || echo "no"
文件类型判断
-b : 是块设备文件为真(block)
-c : 是字符设备文件为真(char)
-L : 是符号连接文件为真(link)
-d : 是目录为真(Directory)
-e : exist 文件存在为真(exist)。
-s : 文件存在且内容非空为真。
-S : 是套接字文件为真(socket)。
-f : 是普通文件为真
[ -e /root/vicky/abc.log ] && echo "exist file" || echo "not exist file"
文件权限判断
-r : 文件有读权限为真(read)
-w : 文件有写权限为真(write)
-x : 文件有可执行权限为真(execute)
-u : 文件有suid 权限为真
-g : 文件有sgid 权限为真
-k : 文件有sbit 权限为真。
多重条件判断
-a : and
-o: or
! : 非
for file in $(ls ./)
do
echo "this my $file";
done
-----------------------------
sum=0
for (( i=1;i<=100;i=i+1 ))
do
sum=$(( $sum+$i ))
done
while [ $i -le 100 ]
do
#do smthing
done
-------------------------
while read line
do
echo $line
done < test.txt
case "$1" in
start)
echo "start……"
;;
stop)
echo "stop……"
;;
*)
echo "Usage: $0 {start|stop}"
exit 2
esac
* : 匹配任意内容
? : 匹配任意一个内容
[] : 匹配中括号中的一个字符
* : 前一个字符匹配0次或任意多次。
. : 匹配除了换行符(\n)外任意一个字符。
^ : 匹配行首。如:^hello 会匹配以hello 开头的行。
$ : 匹配行尾。 如:hello$ 会匹配以hello 结尾的行。
[] : 匹配中括号中指定的任意一个字符,只匹配一个字符。[a-z][0-9] 匹配小写字符和一位数字构成的两位字符。
[^] : 匹配中括号的字符以外的任意一个字符。如:[^0-9] 匹配任意一位非数字字符。
\ : 转义符。去除符号的特殊用法。
{n} : 表示其前面的字符恰好出现n次。如:[0-9]{4} 匹配4位数字。
{n,} : 表示其前面的字符出现不小于n次。
{n,m} : 表示其前面的字符至少出现n次,最多出现m次。如:[a-z]{6,8} 匹配6到8位的小写字符。
==注:以上三个大括号的用法其实要有定界符才能准确匹配,否则光看概念,与实际是有区别的。==
脚本中的语句不是在当前shell 进程 中执行的。
这种方式可以将参数统一写到一个sh中,在另外一个shell 脚本 中引用 。
#变量设置成全局变量
export a="aaa"
declare -x a="aaa"
#将其它文件包含到当前进程。
. test.sh
source test.sh
#第一个命令成功则执行第二个命令
./hello.sh && ./world.sh
#第一个命令失败则执行第二个命令
./hello.sh || ./world.sh
#常用综合用法
ls oklar && echo yes || echo no
sh -x aaa.sh
#还可以设置PS4让调试代码显示行号$LINENO
export PS4="+[${LINENO}] "
#pipe line (同一个父进程)
#name pipe (不同父进程)
mkfifo fifo
$(command) = ` command` #不建议使用倒引号,不能嵌套使用