1、第一行要写明shell种类
#!/bin/bash
2、打印输出
#!/bin/bash
echo "Hello World !~"
echo "Hello World !~"
3、变量定义
- 变量=前后不能有空格,字符串要用“或‘ 或 不用
- 变量是若定义的,不定义也可使用,既:值为空
- 变量可以用 { } 括起来,明确变量名称的范围
#!/bin/bash
v_name="LiKun"
v_id=1
echo $v_name
v_name="LiKun"
v_id=1
echo $v_name
echo ${v_name}_good
echo $v_id
echo $v_id
echo $null
./test.sh
LiKun
LiKun_good
1
LiKun
LiKun_good
1
- 变量替换
a=${b:-0}如果b为空值,则用0代替b赋给a;b有值则不再作任何替换
x=${1:-0}用户没有输入参数,则用0代替$1
- 变量截取
a=1234567
echo ${a:3}4567从第三个字符开始到最后
echo ${a:3:2}45从第三个字符开始截取两个
echo ${a#*3}从任意字符开始直到截取到3123
echo ${#a}7变量的字符数
4、字符串,变量定义,单引号和双引号的区别
- 使用双引号的变量,可以调用变量,也可以使用转义符 '\'
#!/bin/bash
v_name="LiKun"
v_id="${v_name}_aa"
echo $v_name
echo $v_id
v_name="LiKun"
v_id="${v_name}_aa"
echo $v_name
echo $v_id
./test.sh
LiKun
LiKun_aa
LiKun
LiKun_aa
- 单引号字符串的限制:
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
- 单引号字串中不能出现单引号(对单引号使用转义符后也不行)。
#!/bin/bash
v_name="LiKun"
v_id="${v_name}_aa"
echo $v_name
echo $v_id
v_name="LiKun"
v_id="${v_name}_aa"
echo $v_name
echo $v_id
./test.sh
LiKun
${v_name}_aa
LiKun
${v_name}_aa
- 字符串的长度和截取:
#!/bin/bash
v_name="LiKun is very good"
echo ${#v_name}
echo ${v_name:2:4}
v_name="LiKun is very good"
echo ${#v_name}
echo ${v_name:2:4}
./test.sh
18
Kun
18
Kun
5、注释
#
如果大段的注释,可以用大括号括起来,形成一个函数,没人调用函数就相当于注释了
6、数组
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。下标由0开始编号。下标可以是整数或算术表达式,其值应大于或等于0。
*注意元素间间隔为‘空格’
#!/bin/bash
array_name=(value0 value1 value2 value3) #定义数组
echo ${array_name[0]} #输出数据单个元素
echo ${array_name[1]}
echo ${array_name[2]}
echo ${array_name[3]}
echo ${array_name[@]} #输出数组所有元素 ,@也可用*
echo ${#array_name[@]} #输出数组长度
array_name=(value0 value1 value2 value3) #定义数组
echo ${array_name[0]} #输出数据单个元素
echo ${array_name[1]}
echo ${array_name[2]}
echo ${array_name[3]}
echo ${array_name[@]} #输出数组所有元素 ,@也可用*
echo ${#array_name[@]} #输出数组长度
./test.sh
value0
value1
value2
value3
value0 value1 value2 value3
4
value0
value1
value2
value3
value0 value1 value2 value3
4
7、变量比较
- 数值测试(以下参数只能判断数值类型)
参数 | 说明 |
---|---|
-eq | 等于则为真 |
-ne | 不等于则为真 |
-gt | 大于则为真 |
-ge | 大于等于则为真 |
-lt | 小于则为真 |
-le | 小于等于则为真 |
#!/bin/bash
num1=1
num2=2
if [ $num1 -eq $num2 ]
then
echo "这两个值相等"
else
echo "这两个值不相等"
fi
num1=1
num2=2
if [ $num1 -eq $num2 ]
then
echo "这两个值相等"
else
echo "这两个值不相等"
fi
./test.sh
这两个值不相等
这两个值不相等
- 字符串测试
参数 | 说明 |
---|---|
== | 等于则为真 |
!= | 不相等则为真 |
-z 字符串 | 字符串长度伪则为真 |
-n 字符串 | 字符串长度不伪则为真 |
! [ abc == 123 ] [ ! abc == 123 ] 取反
[ abc == 123 -a xyz == xyz]与
[ abc == 123 -o xyz == xyz]或
#!/bin/bash #判断字符串相等
num1="aaa"
num2="bbb"
if [ "$num1" == "$num2" ] #注意此处【】和=前后要留有空格
then
echo "这两个值相等"
else
echo "这两个值不相等"
fi
num1="aaa"
num2="bbb"
if [ "$num1" == "$num2" ] #注意此处【】和=前后要留有空格
then
echo "这两个值相等"
else
echo "这两个值不相等"
fi
./test.sh
这两个值不相等
这两个值不相等
#!/bin/bash # -z 判断如果为空,为真;不为空,为假
num1="aaa"
if [ -z "$num1" ] #注意此处【】和=前后要留有空格
then
echo "这个字符串为空"
else
echo "这个字符串有值"
fi
num1="aaa"
if [ -z "$num1" ] #注意此处【】和=前后要留有空格
then
echo "这个字符串为空"
else
echo "这个字符串有值"
fi
./test.sh
这个字符串有值
这个字符串有值
#!/bin/bash # -n 判断如果不为空,为真;
num1="aaa"
if [ -n "$num1" ] #注意此处【】和=前后要留有空格
then
echo "这个字符串有值"
else
echo "这个字符串为空"
fi
num1="aaa"
if [ -n "$num1" ] #注意此处【】和=前后要留有空格
then
echo "这个字符串有值"
else
echo "这个字符串为空"
fi
./test.sh
这个字符串有值
这个字符串有值
- 文件测试
参数 | 说明 |
---|---|
-e 文件名 | 如果文件存在则为真 |
-r 文件名 | 如果文件存在且可读则为真 |
-w 文件名 | 如果文件存在且可写则为真 |
-x 文件名 | 如果文件存在且可执行则为真 |
-s 文件名 | 如果文件存在且至少有一个字符则为真 |
-d 文件名 | 如果文件存在且为目录则为真 |
-f 文件名 | 如果文件存在且为普通文件则为真 |
-c 文件名 | 如果文件存在且为字符型特殊文件则为真 |
-b 文件名 | 如果文件存在且为块特殊文件则为真 |
#!/bin/bash
cd /bin
if [ -e ./bash ]
then
echo 'The file already exists!'
else
echo 'The file does not exists!'
fi
cd /bin
if [ -e ./bash ]
then
echo 'The file already exists!'
else
echo 'The file does not exists!'
fi
./test.sh
The file already exists!
The file already exists!
- (($a==$b)) 数值之间的比较
#!/bin/bash
a=1
b=1
(($a==$b))
echo $?
a=1
b=1
(($a==$b))
echo $?
./test.sh
0
7、运算
- 计算器
echo $[8+9]$((8+9))expr 8 + 9echo 10/3 | bc -l
echo "scale=3; 10/3" | bc -l指定小数点后保留3位
- “(( ))” 双括号运算符使用,只能进行数值
语法:
((表达式1,表达式2…))
特点:
1、在双括号结构中,所有表达式可以像c语言一样,如:a++,b--等。
2、在双括号结构中,所有变量可以不加入:“$”符号前缀。
3、双括号可以进行逻辑运算,四则运算
4、双括号结构 扩展了for,while , if条件测试运算
5、支持多个表达式运算,各个表达式之间用“,”分开
#!/bin/bash
a=1;
b=2;
((a=b+1));
echo $a;
a=$((a+1))
echo $a
((a++))
echo $a
a=1;
b=2;
((a=b+1));
echo $a;
a=$((a+1))
echo $a
((a++))
echo $a
((a++,b++))
echo $a,$b
./test.sh
3
4
5
3
4
5
6,3
- 扩展逻辑运算
#!/bin/sh
a=1;
b="ab";
echo $((a>1?8:9)); #真返回8,假返回9
((b!="a"))&& echo "err2" || echo 'yes'; #真执行&&,假执行||
((a<2))&& echo "ok";
运行结果:
9
err2
ok
7、if else 分支判断
语法:
if [] then
xxx
elif [] then
xxx
else xxx
fi
#!/bin/bash
num1=1
num2=2
if [ $num1 -eq $num2 ]
then
echo "相等"
elif elif ((num1>num2)) # 比较的另一种写法,推荐 > < == if (($(($i%500))==0))
then
echo "大于"
else
echo "小于"
fi
num1=1
num2=2
if [ $num1 -eq $num2 ]
then
echo "相等"
elif elif ((num1>num2)) # 比较的另一种写法,推荐 > < == if (($(($i%500))==0))
then
echo "大于"
else
echo "小于"
fi
./test.sh
小于
小于
8、case in 条件分支
取值后面必须为单词in,每一模式必须以 ) 结束。取值可以为变量或常数,以 ;; 结束分支。
每个分支可有多个命令
单个分支有多个值,中间用 | 分割,如:2|3
#!/bin/bash
aNum=3
case $aNum in
1) echo 'You select 1'
;;
2) echo 'You select 2'
;;
2|3) echo 'You select 3'
echo 'Good'
;;
4) echo 'You select 4'
;;
*) echo 'You do not select a number between 1 to 4'
;;
esac
aNum=3
case $aNum in
1) echo 'You select 1'
;;
2) echo 'You select 2'
;;
2|3) echo 'You select 3'
echo 'Good'
;;
4) echo 'You select 4'
;;
*) echo 'You do not select a number between 1 to 4'
;;
esac
./test.sh
You select 3
Good
You select 3
Good
9、for 循环语句
#!/bin/bash # in 为数值类型
for i in 1 2 3 4 5
do
echo "The value is: $i"
done
for i in 1 2 3 4 5
do
echo "The value is: $i"
done
./test.sh
The value is: 1
The value is: 2
The value is: 3
The value is: 4
The value is: 5
The value is: 1
The value is: 2
The value is: 3
The value is: 4
The value is: 5
#!/bin/bash # in 为字符串
for i in 'str 1' 'str 2' 'str 3'
do
echo "The value is: $i"
done
for i in 'str 1' 'str 2' 'str 3'
do
echo "The value is: $i"
done
./test.sh
The value is: str 1
The value is: str 2
The value is: str 3
The value is: str 1
The value is: str 2
The value is: str 3
#!/bin/sh
num=100;
total=0;
for((i=0;i<=num;i++)) # 循环控制
do
((total+=i))
done
echo $total
num=100;
total=0;
for((i=0;i<=num;i++)) # 循环控制
do
((total+=i))
done
echo $total
./test.sh
5050
5050
10、while 循环语句
#!/bin/bash
COUNTER=0
while [ $COUNTER -lt 5 ] #或者 ((COUNTER<5))
do
COUNTER=$[COUNTER+1] #或者写成 COUNTER=$((COUNTER+1))
echo $COUNTER
done
COUNTER=0
while [ $COUNTER -lt 5 ] #或者 ((COUNTER<5))
do
COUNTER=$[COUNTER+1] #或者写成 COUNTER=$((COUNTER+1))
echo $COUNTER
done
./test.sh
1
2
3
4
5
1
2
3
4
5
11、break continue
break命令允许跳出所有循环(终止执行后面的所有循环)。
continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。
12、函数
#!/bin/bash
demoFun(){
echo "This is your first shell function!"
}
echo "Function begin..."
demoFun
echo "Function end!"
demoFun(){
echo "This is your first shell function!"
}
echo "Function begin..."
demoFun
echo "Function end!"
./test.sh
Function begin...
This is your first shell function!
Function end!
Function begin...
This is your first shell function!
Function end!
#!/bin/bash #带有return语句的函数,函数返回值在调用该函数后,通过 $? 来获得。
funWithReturn(){
aNum=10
bNum=20
return $(($aNum+$bNum))
}
funWithReturn
echo "$?"
funWithReturn(){
aNum=10
bNum=20
return $(($aNum+$bNum))
}
funWithReturn
echo "$?"
./test.sh
30
30
#!/bin/bash # 带参数的函数
funWithParam(){
echo "The value of the second parameter is $2 !"
echo "The value of the tenth parameter is ${10} !"
echo "The amount of the parameters is $# !"
echo "The string of the parameters is $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
funWithParam(){
echo "The value of the second parameter is $2 !"
echo "The value of the tenth parameter is ${10} !"
echo "The amount of the parameters is $# !"
echo "The string of the parameters is $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
./test.sh 1 2 3
The value of the second parameter is 2 !
The value of the tenth parameter is 34 !
The amount of the parameters is 11 !
The string of the parameters is 1 2 3 4 5 6 7 8 9 34 73 !
The value of the second parameter is 2 !
The value of the tenth parameter is 34 !
The amount of the parameters is 11 !
The string of the parameters is 1 2 3 4 5 6 7 8 9 34 73 !
13、位置参数
参数处理 | 说明 |
---|---|
$# | 参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数 |
$$ | 脚本运行的当前进程ID号 |
$n | 第n个参数 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数。 |
$0 | 进程名或文件名 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
#!/bin/bash
echo $*
echo $@
echo $3
echo $0
echo $$
echo $#
echo $?
echo $*
echo $@
echo $3
echo $0
echo $$
echo $#
echo $?
./test.sh 1 2 3
1 2 3
1 2 3
3
./test.sh
9388
3
0
1 2 3
1 2 3
3
./test.sh
9388
3
0
特殊:
#!/bin/bash
echo ${1##*.} # ‘##’意思是把$1参数,接去掉.前面的(包括. ,并截取到最后一个)
echo ${1##*.} # ‘##’意思是把$1参数,接去掉.前面的(包括. ,并截取到最后一个)
[oracle@lk1 shell]$ ./2.sh aa.bb
bb
[oracle@lk1 shell]$ ./2.sh aa.bb.cc
cc
bb
[oracle@lk1 shell]$ ./2.sh aa.bb.cc
cc
$@和$*的区别:
#!/bin/bash
for i in "$*"
do
echo $i
done
for i in "$@"
do
echo $i
done
for i in "$*"
do
echo $i
done
for i in "$@"
do
echo $i
done
./test.sh 1 2 3
1 2 3
1
2
3
1 2 3
1
2
3
14、反引号 `
file `which passwd`
$()相当于``
file $(which passwd)
15、交互输入
#!/bin/bash
read -p "please: " -s -n 1 a
echo you input: $a
-p:输入前提示
-s:输入内容不显示
-n 1:输入1个字符后即结束输入
16、文件处理
[root@likun python_scripts]# cat 1hello.py | while read line ;do echo '--->'$line;done
--->#!/usr/bin/python
--->'''print 'hello!'
--->print "what's your name?"'''
--->n='''good morning
--->everyone,
--->come on !'''
--->print n