1. 调用.sh脚本
假如个有脚本文件test.sh
1)bash test.sh
2) source test.sh
3)sh test.sh
4)先授权test.sh为可执行程序 sudo chmod +X test.sh 然后执行:. test.sh
//网上写到可以用./test.sh 但我在ubuntu中执行./test.sh会报错,而用.test.sh 则正常
2. 变量:
* 定义:直接定义,前面不需要加什么符号:
name="haha"
注意:变量名和等号之间不能有空格
* 使用变量
使用的时候必须在前面加上$,定义的时候不能加
echo $name
或者:echo ${name}
* 只读变量(相当时常量) 不能修改,不能删除
readonly name="hi"
* 删除变量
unset name #注意,不能加$
* sh中的单双引号与php中差不多,
''内的$name当作字符串解析,,,但.sh中的单引号内不能出现单引号,加了转义符也不行
""中的$name会当作变量来解析
3. 字符串
* 直接拼接,不使用.或+
a="hello"
b="world"
c=$a$b
或c=${a}${b}
* 获取字符串的长度
len=${#a}
* 字符串的截取 ${string:start:length}
sub=${a:0:3} #截取前三个字符
#用 sh test.sh 会报错,用bash test.sh才行,原因是不同版本的bash实现有区别
* 替换 ${string/查找/替换}
rep=${a/o/ii} #把hello变成hellii
* 查找字符串中某个字符所在的位置 `expr index $a 'a'`
pos=`expr index $a 'e'` #返回 2
注意:
1.外层是`,而不是' (不是单引号,而是tab键上边的那个键)
2.位置是从1开始而不是从0开始
* 更多字符串的操作,见:
1. https://www.cnblogs.com/chengmo/archive/2010/10/02/1841355.html
2. http://justcoding.iteye.com/blog/1963463
4. 数组,不能定义多维数组
* 定义:(),元素之间有空格,不能加逗号
arr=(1 2 3 4)
* 读取:
echo arr[0]
* 获取长度
echo ${#arr[@]} 或 echo ${#arr[*]}
5. 运算符:http://www.runoob.com/linux/linux-shell-basic-operators.html
* 算数运算符
* 关系运算符
* 布尔运算符
* 字符串运算符
* 文件测试运算符
* 算数运算:
echo `expr 1 + 1 ' #2
注意:
1. 外层需要用反引号,而不是单引号
2. 以expr 开头
3. 运算符两侧要加空格1 + 1 而不是 1+1
4. 乘法是:`expr 2 \* 2 ` 而不是 `expr 2 * 2 `
5. mac 中的用法在linux中也适用:echo $(( 3 * 2)) #这种写法可以说不用\*
* 关系运算符:
包括 :-eq -ne -gt -lt -ge -le
left=8
if [ $left == 8 ]
then
echo "It is eight"
else
echo "Not eight"
fi
right=9
if [ $right -eq 9 ]
then
echo "It is nine"
else
echo "It is not nine"
fi
* 布尔与关系运算符
布尔:! 非 -o 或 -a 与 说明:-o or -a and
num=10
bnum=20
if [$num -eq 10 -o $bnum -eq 10]
then
echo "or"
else
echo "false"
if
关系:|| &&
if [[ $num == 10 || $bnum == 10 ]]
then
echo "|| or"
else
echo "false"
fi
注意:关系运算外层要两个中括号
了解更多:http://www.runoob.com/linux/linux-shell-basic-operators.html
6. 判断
* if 判断
if condition
then
dothing......
elif
dothing.....
else
dothine....//不能为空
fi //结束if语句,必须
condition 通常会用[]包住
* case 选择语句
num="hello"
case $num in
hi) echo "hi"
;;
hello) echo "hello"
;;
world) echo "world"
;;
*) echo "other"
;;
esca //结束case(反着写即结束,和if/fi 类似)
7. 循环
* for 循环
for i in 1,2,3,4
do
echo $i
done
for i in "hello world"
do
echo -e $i "\n"
done
//疑问:只在最后打印了换行符,为什么?
* while 循环 (until循环使用方法差不多,一般用while)
int=1
while(( $int<=5 )) //这里要加(())
do
echo $int
let "int++" //let 用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量
done
* 无限循环
while :
do
echo -e "99\n"
done
或者:
while (( a==1))
do
echo -e "99\n"
done
* break 和 continue 与其它编程语言中使用方法一致
8. 函数:
8.1 定义:
test(){
echo "test"
}
问题:资料上说可以用function test(){}定义,但测试后提示语法错误
8.2 调用
直接写函数名,不需要加括号
8.3 返回值
直接 return ,如果不写return,系统会自动返回最后一句的结果
8.4 获取返回值
不是通过赋值,而是在函数执行后用 $? 获取返回值
re(){
return "99"
}
re
echo "I am return" $?
//只能返回0-255的数字
8.5 传参
param(){
echo "first name:" $1
echo "second name:" $2
}
param "first" "middle"
大于9的参数,通过${num} 来获取
$* 获取所有参数
param2(){
echo "all:" $*
}
param2 "hello" "world" "linux" "!"
param3(){
echo "all:" $@
}
param3 "hello" "world" "linux" "!"
9. 获取用户输入
read str
echo $str //把用户输入的内容赋值给str变量
10. 把数制输出为文件而不直接显示
//用 >
echo "hello world">hello.txt
cat hello.txt
//返加内容,用 >>
echo "hello linux">>hello.txt
cat hello.txt
11. 包括其它文件
* .+文件名引入
. ./inc.sh
#inc.sh
url="http://www.baidu.con"
#test.sh
. ./inc.sh
echo $url
疑问:网上说可能通过 # source ./inc.sh 方式引入文件,但实测发现不行,不知为什么?