1. 如何开始
打开Linux
终端,使用指令创建文件,以.sh
结尾,拓展名不重要,并不影响脚本的执行。
但是通常会设置为.sh
表示此为一个shell脚本
。
vi / vim #创建文件
2. 输出
1. vim output.sh //创建文件
2. echo "hello shell" //文件内编辑
3. wq
编辑后使用wq
指令完成编辑。
3. 运行脚本
chmod +x ./output.sh #运行权限
./output.sh
./output.sh & #后台运行
jobs #查看当前运行的脚本
fg %number #将number编号的脚本切换到前台运行
ctrl+z #切换到后台并暂停
bg number #将number编号的脚本开始后台启动
4. 变量
① 定义
name="hlc"
② 使用变量
${name}
echo ${name} #打印变量
③ 只读变量
readonly name #将`name`设置为只读
④ 删除变量
不可以删除只读变量。
unset name
⑤ 字符串
str='hlc ${name}' #无法识别变量
str="hlc ${name}" #可以识别变量
⑥ 字符串长度
${#str}
⑦ 截取字符串
${str:1:2} #从字符串下边`1`开始向后截取2位
5. 数组
① 定义
array=(
value
value
value
value
)
或
array[0]=value
array[1]=value
array[100]=value #下标可以不连续
② 读取数组
${array[0]}
${array[@]} 获取所有
③ 获取数组长度
${#array[@]}
6. 传参
① 传递参数
./output.sh 第一个参数 第二个参数 第三个参数 #参数从0开始,0位参数默认为文件名
② 获取参数
echo $1
echo $2
echo $3
echo $0
③ 特殊参数
$# 获取传递到脚本的参数个数
$* 获取所有传递进来的参数
$$ 获取脚本进程ID
$! 获取后台运行的最后一个进程ID
$@ 同样获取所有传递进来的参数,但是每个参数会加引号
$- 显示`Shell`使用的当前选项
$? 显示脚本退出状态,0为正常,其他为异常
7. 运算符
原生的
bash
不支持数学运算,但是可以通过其他命令来完成,例如awk
和expr
,后者最常用。
① 使用规范
value=`expr 1 + 1`
echo "${value}"
注意expr
和表达式之间必须由空格隔开,表达式也是。1+1
时错误的应该写成1 + 1
。
② 常用运算符
与Java
基本无异。
8. echo
指令
① 打印字符串
echo "内容"
echo '内容'
② 显示变量
echo "${value}"
③ 转义
echo -e "test \n next line" #-e 开启转移 \n换行
echo -e "test \c" # \c 不换行
echo -e "this line"
④ 将结果输出到文件
echo "test" > filename
⑤ 打印命令执行结果
echo `date`
9. test
命令
① 数值测试
if test $[num1] -eq $[num2]
then
echo '相等'
else
echo '不相等'
fi
参数 | 说明 |
---|---|
-eq | 等于则为真 |
-ne | 不等于则为真 |
-gt | 大于则为真 |
-ge | 大于等于则为真 |
-lt | 小于则为真 |
-le | 小于等于则为真 |
代码中[]
可以进行基本算术运算
if test $[num1+num3] -eq $[num2]
then
echo 'num1+num3=num2'
else
echo '不等于'
fi
② 字符串测试
if test ${str1} = ${str2}
then
echo '相等'
else
echo '不相等'
fi
参数 | 说明 |
---|---|
= | 等于则为真 |
!= | 不相等则为真 |
-z 字符串 | 字符串的长度为零则为真 |
-n 字符串 | 字符串的长度不为零则为真 |
③ 文件测试
if test -e ./output.sh
then
echo '存在'
else
echo '不存在'
fi
参数 | 说明 |
---|---|
-e 文件名 | 如果文件存在则为真 |
-r 文件名 | 如果文件存在且可读则为真 |
-w 文件名 | 如果文件存在且可写则为真 |
-x 文件名 | 如果文件存在且可执行则为真 |
-s 文件名 | 如果文件存在且至少有一个字符则为真 |
-d 文件名 | 如果文件存在且为目录则为真 |
-f 文件名 | 如果文件存在且为普通文件则为真 |
-c 文件名 | 如果文件存在且为字符型特殊文件则为真 |
-b 文件名 | 如果文件存在且为块特殊文件则为真 |
④ 与或非
参数 | 说明 |
---|---|
-a | 与 |
-o | 或 |
! | 非 |
if test -e ./output.sh -o -e ./test.sh
then
echo '存在一个'
else
echo '都不存在'
fi
10. 流程控制
① 条件判断
# if
if 条件
then
待执行语句...
fi
# if - else
if 条件
then
待执行语句...
else
待执行语句...
fi
# if - else - if
if 条件
then
待执行语句...
elif 条件
then
待执行语句...
else
待执行语句...
fi
例如:
a = 1
b = 2
if test $[a] -gt $[b] #或 if test [${a} > ${b}]
then
echo 'a 比 b 大'
else
echo 'b 比 a 大'
fi
② 循环控制
for
#方式1
for item in 1 2 3
do
echo "The value is: ${item}"
done
# The value is: 1
# The value is: 2
# The value is: 3
#方式2
for item in "This is a string"
do
echo ${item}
done
# This
# is
# a
# string
while
i=3
while((${i}<=5))
do
echo "The value is:${i}"
let "i++" #或 i=`expr ${i} + 1`
done
until
until 条件
do
待执行语句...
done
③ case
echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case ${aNum} in
1) echo '你选择了 1'
;;
2) echo '你选择了 2'
;;
3) echo '你选择了 3'
;;
4) echo '你选择了 4'
;;
*) echo '你没有输入 1 到 4 之间的数字'
;;
esac
④ break
和continue
同Java
。
11. 函数
① 创建函数
doSomething() {
//todo
}
② 调用
doSomething
③ 参数传递
doSomething 1
doSomething() {
echo "${1}"
}
④ 返回值
doSomething #调用函数
echo "返回值为: $?" #获取返回值