#!/bin/sh
chmod +x test.sh
./test.sh
sh test.sh
readonly var_name
$0:当前脚本文件名
$n:脚本参数(n=1,2,3...),大于9的参数必须用大括号括起来,如${10}
$#:参数个数
$*:所有的参数当作一个参数:"$1 $2 $3 ... $n"
$@:所有的参数当作不同的参数:"$1", "$2", "$3", ... , "$n"(循环中一般用这种)
$?:上一个命令的退出值
$$:当前脚本的进程号
$!:上一个后台命令的进程号
定义并初始化数组:array_name=("hello" "world")
单独赋值数组成员:array_name[0]="bebye"
读取数组成员:echo ${array_name[0]}
读取所有数组成员:
echo ${array_name[*]}
echo ${array_name[@]}
假设:变量a=10
,变量b=20
。以下三种方法一样:
echo `expr $a + $b`
echo $(expr $a + $b)
echo $(($a+$b))
注意:斜引号(Tab上面的那个键)括起来可以表示系统命令
+:加
-:减
*:乘
/:除
%:模
**:幂
=:赋值
==:相等比较,返回bool值
!=:不等比较:返回bool值
注意:
-eq:相等
-ne:不等
-gt:大于
-lt:小于
-ge:大于等于
-le:小于等于
!:逻辑非
-o:逻辑或
-a:逻辑与
=:相等
!=:不等
-z:长度是否为0,变量是否定义
-n:长度是否不为0
str:字符串是否非空,非空返回true
-b:是否是块文件
-c:是否是字符文件
-d:是否是目录
-f:是否是普通文件
-g:是否设置gid(SGID)
-k:是否设置sticky位
-p:是否是管道文件
-t:文件描述符是否打开并关联一个终端
-u:是否设置uid(SUID)
-r:是否可读
-w:是否可写
-x:是否可执行
-s:文件大小是否大于0
-e:是否存在
if [ expression 1 ]
then
Statement 1
else
Statement 2
fi
if [ expression 1 ]
then
Statement 1
elif [ expression 2 ]
then
Statement 2
else
Statement 3
fi
case word in
pattern1)
Statement
;;
pattern2|pattern3)
Statement
;;
esac
注意:匹配模式最小是一个。;;类似于c语言中的break
while command
do
Statement
done
for var in word1 word2 ... wordN
do
Statement
done
until command
do
Statement
done
select var in word1 word2 ... wordN
do
Statement
done
注意:select语句会打印一个选项菜单,Statement语句中可以与case语句搭配
function_name () {
#list of commands
echo "Hello World $1 $2"
return n
}
function_name arg1 arg2 ... argn
if [ 1 == "$var_a" -a 1 == "$var_b" ]
if [ "name" == "$var_c" ]
. filepath
可以把一个文件解析成bash语句,程序就可以使用这个文件里定义的变量了:> filename
可以把文件长度截短为0,相当于cat /dev/null > filename
A > B
:把A输出到B,A < B
:A从B中读取A &> B
:把A的标准输出和标准错误重定向到Bcd -
可以快速跳转到之前的路径,是使用了$OLDPWD
环境变量Ctrl-B
退格,Ctrl-F
前进,Ctrl-H
退格并删除,Ctrl-L
清屏${#string}
`expr length $string`
`expr "$string" : '.*'`
var=`sed -n '$=' xxx.txt`