@Pigmon
2019-09-02T16:10:02.000000Z
字数 3895
阅读 938
Ubuntu
变量赋值等号两边不能有空格,变量命名规则和C语言一样。
your_name="Tom"
变量赋值不加 $ ,使用定义过的变量要加上:
echo $your_name #或者${your_name}
加大括号有助于解释器找到变量名边界,应该一直都加上。
my_name='King'
readonly my_name #为变量加只读属性
删除变量(不能删除只读变量)
unset your_name
echo 'You are ' ${your_name} # 只输出 You are
单引号和双引号:
单引号字符串不支持变量和转义字符。
单引号字符串可以和变量及其他字符串数字等拼接。
echo 123 'You are' ${your_name}", and I am the ${my_name}"
# 123 You are Tom, and I am the King
字符串长度:
echo ${#my_name} # 4
# 提取子串
string1='2B or not 2B, it is not a question.'
echo ${string1:9:3} # 2B
# 查找子串
echo `expr index "${string1}" 2B` # 1 (不是从0开始)
不支持多维数组,下标从0开始
my_array=('Sex' 'Money' 'Game') # 注意是空格不是逗号
echo ${my_array[1]} # Money
echo ${my_array[@]} # 读取数组全部元素,输出:Sex Money Game
echo 'The length of entire array:' ${#my_array[@]} # 3
echo 'This is also array length:' ${#my_array[*]} # 3
echo 'This is just the length of Game:' ${#my_array[2]} # 4
# 脚本命令行参数,输入:./lesson00.sh 1 2 abc
echo ${0} ${1} ${2} ${3} # ./lesson00.sh 1 2 abc
echo 'Count of parameters:' ${#} # 3
# 所有参数作为一个字符串提取
for param in "$*"; do
echo $param
done
# 每个参数作为一个字符串提取
for param in "$@"; do
echo $param
done
# 只有加双引号才有这个区别
# 输出本进程ID
echo $$
# 后台运行的最后一个进程ID
echo $!
# Shell 使用的当前选项,相当于 set 命令
echo $- # hB
# 最后命令的退出状态,0或错误代码
echo $?
Shell 本身不支持数学运算,要使用表达式
expr 为表达式命令,其他还有 awk
运算符两侧不能有空格
sum=`expr 3 + 5` # 表达式要用键盘左上角的反引号扩起来
echo ${sum}
# 注意:运算符两侧要有空格,这样不行:3+5
a=10
b=8
mul=`expr ${a} \* ${b}` # 注意乘号和C不同,要有反斜杠
echo ${mul} # 80
# # 是否相等 == 和 !=
if [ ${a} == ${b} ] # 中括号内侧和运算符两侧必须有空格
then
echo ${a} 'echo to' ${b}
else
echo ${a} 'is not echo to' ${b}
fi
# # 只能用给数字的逻辑运算符
# # -eq -ne -gt -ld -ge -le
if [ ${a} -eq ${b} ]
then
echo ${a} 'echo to' ${b}
else
echo ${a} 'is not echo to' ${b}
fi
# if [ $a -le 10 -a $b -ge 1 ] # 或者
if [[ $a -le 10 && $b -ge 1 ]] # 注意这2组[]
then
echo 'OK'
fi
# if [ $a -eq 10 -o $b -eq 10 ] # 或者
# if [[ $a -eq 10 || $b -eq 10 ]] # 或者
if [[ $a == 10 || $b == 10 ]]
then
echo 'OK'
fi
if [ ! $a == $b ]
then
echo 'OK'
fi
result=$[$a != $b] # 等号两边不能有空格;中括号内可以无空格?
echo $result # 1
字符串逻辑运算
str1='abc'
str2='efg'
str3='abc'
if [ $str1 = $str3 ] # 注意不是 ==
then
echo $str1 'eque to' $str3
fi
if [ $str1 != $str2 ]
then
echo $str1 'not eque to' $str2
fi
if [ -z $str1 ]
then
echo $str1 'len is 0'
fi
if [ -n $str1 ]
then
echo $str1 'len is not 0'
fi
if [ $str1 ]
then
echo $str1 'is not empty'
fi
文件逻辑操作
file="/home/pigmon/Workspace/ShellLesson/lesson00.sh"
if [ -e $file ]
then
echo 'File exists.'
fi
# -s 文件不空
# -r -w -x 可读,可写,可执行
# -d 是否是目录
echo -e "Line 1.\n"
echo "Line 2."
echo -e "Line 3.\c" # \c 代表不换行
echo "Line 4."
echo `date`
输出:
Line 1.
Line 2.
Line 3.Line 4.
2019年 08月 22日 星期四 13:52:52 CST
比 echo 可移植性更好,跟C的printf很接近。
与C语言区别:
没有小括号
%后面跟一个减号‘-’代表左对齐,不跟减号代表右对齐
格式描述字符串可以用单引号或者无引号
以及如下:
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
# 郭靖 男 66.12
# 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
printf "%s\n" abc def
# 如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替
printf "%s and %d \n"
if test $a != $b
then
echo Not eque
fi
循环也支持 break 和 continue
exp1=$[2*3] # 这里*前面不用/
exp2=$[1+5] # 而且这里操作符两边又不能有空格了
if test $[exp1] -eq $[exp2] # 这里必须有[]
then
echo 'Eque'
elif test $[exp1] -gt $[exp2]
then
echo 'Greater'
else
echo 'Less'
fi
for num in 1 2 3 4 5
do
printf "%d," $num
done
echo ""
for str in I am the King!
do
echo $str
done
num=10
while (( $num <= 15 ))
do
printf "%d," $num
let "num++"
done
echo ""
a=0
until [ ! $a -lt 10 ]
do
printf "%d," $a
a=`expr $a + 1`
done
echo ""
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
# case 后面别忘了 in
# 条件后面是 )
# 符合条件,执行至 ;; 为止
# *) 相当于 default
# 结尾是反过来的case:esac
# # ---------------------------
fun1()
{
echo "A most simple function."
}
fun1 # A most simple function.
# # ---------------------------
fun2()
{
echo "A function with return value."
ret=`expr 3 + 5`
return $ret
}
fun2 # A function with return value.
echo $? # 8 捕捉最后一个输出
echo $? # 0 代表上一个命令没有出错
# 说明如果函数调用和$?之间插入任何语句,都会丢失返回值。
# # ---------------------------
fun3()
{
echo 'Count of params is:' $#
echo 'The 1st parameter is:' ${1}
}
fun3 param1 2
# Count of params is: 2
# The 1st parameter is: param1
# 注意如果参数个数超过9就必须加{},如${10}
文件描述符,0-stdin, 1-stdout, 2-stderr
刷新:
$ command1 > file1
追加
$ command1 >> file1
$ command1 < file1
同时重定向输入输出
command1 < infile > outfile
将stderr重定向
command1 2 >> file1
将stdout, stderr全部重定向(不写描述符是不是就这个效果?)
$ command >> file 2>&1
stdin, stdout 重定向
$ command < infile1 > outfile1
屏蔽输出
$ command > /dev/null
通过 . 或者 source 进行引用
例如:
include.sh
#!/bin/bash
my_name='The King'
src.sh
#!/bin/bash
# source ./include.sh # 或者
. ./include.sh
echo 'I am '$my_name # I am The King