创建脚本
# touch hello.sh
头部
#!/bin/bash
编辑为可执行文件后执行
# chmod +x ./hello.sh
# ./hello.sh #启用子shell进行运行
# . hello.sh #同层shell进行运行
# source hello.sh #同层shell进行运行
变量
以$符开始
系统预定义变量(全局)
$HOME #家目录
$PWD #当前工作目录
$USER #当前用户
$PATH
显示系统中所有的预定义变量
# env
显示当前shell中所有的变量
# set
自定义类型(局部)
基本语法
变量名=值(=前后不能加空格)
my_var=1
export 变量名, 可以将变量提为全局变量
export my_var
运算符
a=$((1+6))
a=$[1+6]
只读变量
readonly b=5
取消变量(不能取消只读变量)
unset a
特殊变量
$n(数字)
调用脚本时的位置参数
$0指脚本名字(调用时如何输入)
$#指参数个数
#! /bin/bash
echo '============$n================' #单引号可以让$n失效为字符串
echo $0
echo $1
echo $2
echo $#
$* 和 $@
$*把所有参数作为一个整体
$@也是获取所有参数, 但是可以用循环遍历
在 for xxx in $* 和 for xxx in $@ 是一个效果
在 for xxx in "$*" 和 for xxx in "$@" 效果不同
$?
最后一次执行的命令的返回状态
如果这个变量的值为0, 证明上一个命令正确执行,
如果非0, 则证明上个命令执行不正确
运算符
$((运算式)) 或者 $[运算式]
echo $((5*2))
echo $[5*2]
#命令转换的方式
echo $(expr 5 \* 2)
echo `expr 5\* 2`
流程控制
条件判断
test
# a=hello
# echo $a
# test $a = hello
# echo $?
0
# test $a = Hello
# echo $?
1
[ condition ] (记得空格空开)
# [ $a = hello ]
# echo $?
0
# [ $a = Hello ]
# echo $?
1
# [ asdfghjkl ]
# echo $?
0
# [ ]
# echo $?
1
# [ $a != Hello ]
# echo $?
0
常用条件判断
逻辑与 && -a
[ condition1 ] && [ condition2 ]
[ condition1 -a condition2 ]
逻辑或 ||
[ condition1 ] || [ condition2 ]
[ condition1 -o condition2 ]
逻辑短路
# [ condition ] && echo OK || echo NO
如果condition是true, 执行&&后面的
如果condition是false, 执行||后面的
分支流程
if [ condition ];then
程序
fi
if [ condition ]
then
程序
fi
if [ condition ]
then
程序
elif [ condition ]
then
程序
else
then
程序
fi
case $a in
"v1")
程序
;;
"v2")
程序
;;
*)
程序
;;
esac
注: 防止shell脚本未传参运行报错
#!/bin/bash
if [ "$1"x = "sunya"x ]
then
echo OK
fi
循环流程
for (( 初始值;循环条件;变量变化 ))
do
程序
done
for (( i=1; i <= $1; i++ ))
do
sum=$[ $sum + $i ]
done
echo $sum
注: 这里用的双小括号, 可以直接使用数学运算式, 可以用<=
for 变量 in 值1, 值2, 值...
do
程序
done
for i in {1..100} #1-100的序列
do
程序
done
a=1
while [ $a -le $1 ]
do
sum=$[ $sum + $a ]
a = $[ $a + 1 ]
done
注: 可以用let去掉这样的反人类写法
a=1
while [ $a -le $1 ]
do
let sum+=a
let a++
done
read读取控制台输入
read (选项) (参数)
选项:
-p: 指定读取时的提示符
-t: 指定读取值时等待的时间(秒), 用户一直不输入会超时退出
参数:
变量: 指定读取到某个变量参数中
read -t 10 -p "请输入名称" name
echo "$name"
函数
系统函数
# date
当前时间
# basename /root/scri/asdfg
asdfg
本质是字符串的一个替换
basename [string] [suffix]
还可以把后缀去掉
# basename ./hello.sh .sh
hello
# dirname /root/scri/asdfg
/root/scri
获取绝对路径
echo sript path : $(cd $(dirname $0); pwd)
自定义函数
[function] funname [()]
{
Action;
[return int;]
}
中括号的内容可以省略
#!/bin/bash
function add(){
s=$[$1 + $2]
echo $s
}
read -p "请输入第一个整数: " a
read -p "请输入第一个整数: " b
add $a $b
#!/bin/bash
function add(){
s=$[$1 + $2]
echo $s
}
read -p "请输入第一个整数: " a
read -p "请输入第一个整数: " b
sum=$(add $a $b)
echo $sum