数组
## 以空格分开
IPTS=(10.0.0.1 10.0.0.2 10.23.12.01)
## 显示数组的所有元素
echo ${IPTS[@]}
## 显示数组元素个数 (${#IPTS[@]} 不能有空格)
echo ${#IPTS[@]}
## 显示数组的第一个元素
echo ${IPTS[0]}
转义个引用
特殊字符:一个字符不仅有字面意义,还有元意(meta-meaning)
#注释·
;分号
“和’引号("" 双引号为不完全引用,引用的内容会被解析;’’ 单引号是完全引用;`` 反引号执行命令)
\转义符号:
\n\r\t单个字母的转义
\$\”\\单个非字母的转义
$ var1=123
$ echo '$var1'
# echo '$var1' 结果:$var1
$ echo "$var1"
# echo "$var1" 结果:123
$ echo "\$var1"
# 结果:$var1
$ echo " abc"x"edf "
# 结果: abcedf
$ echo " abc\"x\"edf "
# 结果: abc"x"edf
运算符
** 乘方
expr进行运算 (只支持整数运算)
双圆括号是let命令的简化
数字常量的使用方法
let“变量名=变量值"
变量值使用0开头为八进制
变量值使用0x开头为十六进制
## expr 的使用
$ expr 4 + 5
# 结果:9
$ expr 4+5
# 结果:4+5
$ expr 4 + 6 * 5
# 结果:34
$ num1=`expr 4 + 5`
$ num2=`expr 4 + 5 `
$ echo $num1
# 结果:9
$ echo $num2
# 结果:9
$ (( a=4+5))
$ echo $a
# 结果:9
$ ((a++))
# 结果:10
$ d=4+5
$ echo $d
# 结果:4+5
$ echo $(( 5+5 ))
#结果 10
## 不可以出现 b= 4 +5 或者 b=4 + 5 等写法
$ b= 4 +5
特殊字符大全
“” 双引号为不完全引用 ,引用的内容会被解析
‘’ 单引号是完全引用
`` 反引号执行命令
() 单独使用圆括号会产生一个子shell(xyz=123)或 数组初始化IPS=(ip1ip2ip3)
(()) 双圆括号 shell中算数及赋值运算的扩展 (对应let的用法)
(
)
l
i
n
u
x
中
() linux中
()linux中( )与(反引号)都是用来作命令替换的
[] 单独使用方括号是测试(test)或数组元素功能
[[]] 两个方括号表示测试表达式
<>尖括号重定向符号
{}花括号 范围生成或者输出 (例如:输出范围echo{0…9})
; 命令分隔符 (case 语句的分隔符为;;)
: 空指令
,分隔目录
~ home/家 目录
. 和source命令相同
- 通配符
?条件测试或通配符
$ 取值符号
I 管道符
& 后台运行
_ 空格
## 下面相当于之执行ls命令
$ cma=$(ls)
$ echo $cma
$ [5 -gt 4]
$ echo $?
# 结果: 0
## [[ 5 > 4]] 必须要有空格
$ [[ 5 > 4]]
$ echo $?
# 结果:0
# 文件复制 将passwd 复制为passwd.bak
$ cp/etc/passwd{.bak)
$ (( 5 > 4 && 4 > 3 ))
$ echo $?
# 结果: 0 (0为真 1位假)
$ echo {1..9}
# 结果: 1 2 3 4 5 6 7 8 9
$ echo { 1..9 }
# 结果: { 1..9 }
## 顺序执行ls和pwd
$ ls;pwd
## 此处?表示通配符
$ ls ?.sh
## 上一次访问目录
$ cd -
测试命令test
test 命令用于检查文件或者比较值 (test 比较区分大小写)
test 测试语句可以简化为[]符号
[]符号还有扩展写法[]支持&&、I、<、>
test 可以做以下测试:
1 文件测试
2 整数比较测试
3 字符串测试
语法:test(选项)
选项:
-b<文件>:如果文件为一个块特殊文件,则为真;
-c<文件>:如果文件为一个字符特殊文件,则为真;
-d<文件>:如果文件为一个目录,则为真;
-e<文件>:如果文件存在,则为真;
-f<文件>:如果文件为一个普通文件,则为真;
-g<文件>:如果设置了文件的SGID位,则为真;
-G<文件>:如果文件存在且归该组所有,则为真;
-k<文件>:如果设置了文件的粘着位,则为真;
-O<文件>:如果文件存在并且归该用户所有,则为真;
-p<文件>:如果文件为一个命名管道,则为真;
-r<文件>:如果文件可读,则为真;
-s<文件>:如果文件的长度不为零,则为真;
-S<文件>:如果文件为一个套接字特殊文件,则为真;
-u<文件>:如果设置了文件的SUID位,则为真;
-w<文件>:如果文件可写,则为真;
-x<文件>:如果文件可执行,则为真。
$ test -f /home/test.txt
$ echo $?
## 目录是否存在
$ [-d /etc/ ]
## 判断 5大于 (只有在双[]内才能使用> < = )
$ [ 5 -gt 4 ]
$ [[ 5 > 4 ]]
if test #表达式为真
if test ! #表达式为假
test 表达式1 –a 表达式2 #两个表达式都为真
test 表达式1 –o 表达式2 #两个表达式有一个为真
test 表达式1 ! 表达式2 #条件求反
test –n 字符串 #字符串的长度非零
test –z 字符串 #字符串的长度是否为零
test 字符串1=字符串2 #字符串是否相等,若相等返回true
test 字符串1!=字符串2 #字符串是否不等,若不等反悔false
test 整数1 -eq 整数2 #整数相等
test 整数1 -ge 整数2 #整数1大于等于整数2
test 整数1 -gt 整数2 #整数1大于整数2
test 整数1 -le 整数2 #整数1小于等于整数2
test 整数1 -lt 整数2 #整数1小于整数2
test 整数1 -ne 整数2 #整数1不等于整数2
test File1 –ef File2 两个文件是否为同一个文件,可用于硬连接。主要判断两个文件是否指向同一个inode。
test File1 –nt File2 判断文件1是否比文件2新
test File1 –ot File2 判断文件1比是否文件2旧
test –b file #文件是否块设备文件
test –c File #文件并且是字符设备文件
test –d File #文件并且是目录
test –e File #文件是否存在 (常用)
test –f File #文件是否为正规文件 (常用)
test –g File #文件是否是设置了组id
test –G File #文件属于的有效组ID
test –h File #文件是否是一个符号链接(同-L)
test –k File #文件是否设置了Sticky bit位
test –b File #文件存在并且是块设备文件
test –L File #文件是否是一个符号链接(同-h)
test –o File #文件的属于有效用户ID
test –p File #文件是一个命名管道
test –r File #文件是否可读
test –s File #文件是否是非空白文件
test –t FD #文件描述符是在一个终端打开的
test –u File #文件存在并且设置了它的set-user-id位
test –w File #文件是否存在并可写
test –x File #文件属否存在并可执行
判断、循环语句
if-then
if-then语句基本用法:
if [测试条件成立] 或 命令返回值是否为0
then 执行相应命令
fi 结束
## 判断是否是root用户
$ [ $UID = 0 ]
$ [ $USER = root ]
$ echo $?
$ if [ $UID = 0 ]
$ then echo " user root "
$ fi
if-then-else
if-then-else语句可以在条件不成立时也运行相应的命令
if [测试条件成立]
then 执行相应命令
else 测试条件不成立,执行相应命令
fi 结束
if [测试条件成立]
then 执行相应命令
elif [测试条件成立]
then 执行相应命令
else 测试条件不成立,执行相应命令
fi 结束
if [SUSER=root ];then
echo " user root "
else
echo " other user "
fi
if
if [测试条件成立]
then 执行相应命令
if [测试条件成立]
then 执行相应命令
fi
fi 结束
case
case 语句和select语句可以构成分支
case "$变量” in
“情况1”)
命令…;;
“情况2”)
命令…;;
* )
命令.;;
esac
for 循环
使用反引号或$()方式执行命令,命令的结果当作列表进行处理
for 循环的语法:
for 参数 in 列表
do 执行的命令
done 封闭一个循环
for i in {1..9}
do
echo $i
echo hello
done
[ rootec7~] # for filename in `1s *.mp3`
>do
> mv $filename $(basename $filename. mp3). mp4
>done
C语言的for命令
语法:
for((变量初始化;循环判断条件;变量变化))
do
循环执行的命令
done
while 循环
while test 测试是否成立
do
命令
done
while [ $a-1t 10];
do
((a++);
echo $a;
done
until 循环
until循环与while循环相反,循环测试为假时,执行循环,为真时循环停止
while test 测试是否成立
do
命令
done
循环嵌套和 break、continue
for sc_name in /etc/profile.d/*.sh
>do
> if [-x $sc_name] ; then
.$sc_name
fi
>done
for num in {1..9};
do
if [ $num -eq 5] ; then
break;
fi;
echo $num;
done
使用循环处理命令行参数
命令行参数可以使用$1 $2… ${10}… $n 进行读取
$0 代表脚本名称
$* 和 $@ 代表所有位置参数
$# 代表位置参数的数量
#!/bin/bash
for pos in $*
do
if [ "$pos" = "help" ] ; then
echo $pos $pos
fi
done
或者:
#!/bin/bash
while [ $# -ge 1 ]
do
if [ "$1" = "help" ]; then
echo $1 $1
fi
shift
done
#!/bin/bash
while [ $# -ge 1 ]
do
echo $#
echo "do something"
shift
done