date
bash shell 运行方式
注释事项
a=1 // 正常运行
b = 2 // 错误
c= 3 // 错误
# 任何空格都将导致错误
字符串截取
d='hello'
e="word"
echo $d$e
## hello word
echo hello ${word}
## hello word
echo ${d#*l}
# lo
echo ${##*l}
# o
## # 表示截取 从 文本开头截取到 通配搜索位
## * 通配
## 单 # 选取最短路径的匹配
## 双 # 选取最长路径的匹配
## 路径标识搜索范围
str="aabbccaaabbbcccaaaabbbbccccaabbccabc"
echo ${str#*a}
## abbccaaabbbcccaaaabbbbccccaabbccabc
echo ${str##*a}
## bc
echo ${str%bbcc*}
## aabbccaaabbbcccaaaabbbbccccaa
echo ${str%%bbcc*}
## aa
## % 表示截取 从 同配置搜索位 截取到 文本末尾
## 单双 % 和 单双 # 作用方式是一样的 (范围作用相反 % 从后向前 # 从前向后)
echo ${str:0:3}
## : 和其他语言一样 第一个参数从 0 开始结算
## 第二个参数是截取的个数
## 第二个参数可以是负数 从 -1 开始 (标识截取最后一个字符)
echo ${str:0:-1}
## aabbccaaabbbcccaaaabbbbccccaabbccab
命令行自变量
# bash 可以通过命令行获取外部变量
# $1 表示第一个外部变量
# $2 表示第二个外部变量
# ... 依此类推
if 语句
if [ condition ]
then
action
elif [ condition2 ]
then
action2
elif [ condition3 ]
then
action3
else
actionx
fi
- if 判断 两个中括号中间一定有两个空格
if 文件运算符
| 运算符 | 描述 | 示例 | | ———— | ———— | ———— | |-e |filename |如果 filename存在,则为真 [ -e /var/log/syslog ]| |-d |filename |如果 filename为目录,则为真 [ -d /tmp/mydir ]| |-f |filename |如果 filename为常规文件,则为真 [ -f /usr/bin/grep ]| |-L |filename |如果 filename为符号链接,则为真 [ -L /usr/bin/grep ]| |-r |filename |如果 filename可读,则为真 [ -r /var/log/syslog ]| |-w |filename |如果 filename可写,则为真 [ -w /var/mytmp.txt ]| |-x |filename |如果 filename可执行,则为真 [ -L /usr/bin/grep ]| |filename1 -nt |filename2 |如果 filename1比 filename2新,则为真 [ /tmp/install/etc/services -nt /etc/services ]| |filename1 -ot |filename2 |如果 filename1比 filename2旧,则为真 [ /boot/bzImage -ot arch/i386/boot/bzImage ]|
if 比较运算符
| 运算符 | 描述 | 示例 | | ———— | ———— | ———— | |-z string |如果 string长度为零,则为真 |[ -z “$myvar” ] | |-n string |如果 string长度非零,则为真 |[ -n “$myvar” ] | |string1= string2 |如果 string1与 string2相同,则为真 |[ “$myvar” = “one two three” ] | |string1!= string2 |如果 string1与 string2不同,则为真 |[ “$myvar” != “one two three” ] |
if 算数运算符
| 运算符 | 描述 | 示例 | | ———— | ———— | ———— | |num1-eq | num2 | 等于 [ 3 -eq $mynum ] | |num1-ne | num2 | 不等于 [ 3 -ne $mynum ] | |num1-lt | num2 | 小于 [ 3 -lt $mynum ] | |num1-le | num2 | 小于或等于 [ 3 -le $mynum ] | |num1-gt | num2 | 大于 [ 3 -gt $mynum ] | |num1-ge | num2 | 大于或等于 [ 3 -ge $mynum ] |
字符串比较
if [ "$myvar" = "foo bar oni" ]
then
echo "yes"
fi
## 所有字符串自变量用双引号括起,避免bash发生意外的解析问题
for 循环体
for x in one two three four
do
echo number $x
done
## number one
## number two
## number three
## number four
输出文件夹内所有文件
for file in /var/log/sys*
do
if [ -f ${file} ]
then
echo ${file}
fi
done
while 循环体
while [ condition ]
do
statements
done
case 语句 (循环解压)
case "${x##*.}" in
gz)
gzunpack ${SROOT}/${x}
;;
bz2)
bz2unpack ${SROOT}/${x}
;;
*)
echo "Archive format not recognized."
exit
;;
esac
算数运算
## 使用 $(())
echo $((100/2))
# 50
函数
tarview() {
echo -n "Displaying contents of $1 "
if [ ${1##*.} = tar ]
then
echo "(uncompressed tar)"
tar tvf $1
elif [ ${1##*.} = gz ]
then
echo "(gzip-compressed tar)"
tar tzvf $1
elif [ ${1##*.} = bz2 ]
then
echo "(bzip2-compressed tar)"
cat $1 | bzip2 -d | tar tvf -
fi
}