1.sh:变量
#!/bin/bash
#shell中的变量、赋值运算符=、几种引号(单引号、双引号、反引号)
#shell中的变量没有类型之分,直接赋值即可。shell的局部变量只能在本shell中使用,相当于C函数中的变量仅能在本函数内使用。shell中的环境变量可被本shell创建的所有子shell使用,就像C中的全局变量可被同一源文件中的所有函数使用一样。
#局部变量
a=china #赋值运算符左右不能有空格,因为空格是shell中的命令分隔符。即若变量a后面有空格,a会被当做一条命令。
b="linux"
c='shenzhen,$a' #单引号中不能引用变量,单引号中转义字符无效。
d="shanghai,$a" #双引号中可以引用变量的值,双引号转义字符有效。
e="I love you!" #当字符串中有空格,则需用双引号括起来。
age=25
echo $a # $符号用于引用变量
echo $b
echo $c
echo $d
echo $e
echo $age
#环境变量,变量名前加export关键字,名字一般用大写字母。
export MYHOME=/home/test
echo $MYHOME #注意,shell中的环境变量是局部的,即只在执行该脚本的shell及其子shell内有效。此处定义并未修改到系统环境变量。
export PATH=$PATH:/home/test/script #假设所有脚本同在目录/home/test/script下,这里将它添加至PATH环境变量中,所以下面可用2.sh脚本名来执行脚本2.sh。且环境变量在子进程中仍然有效,即可在2.sh中通过脚本名执行3.sh,可在3.sh内通过脚本名执行4.sh。直至1.sh脚本执行完毕,脚本内定义的环境变量便会消失。
2.sh
#参数变量0-9
echo $0 #命令行上的程序名
echo $1 #第一个参数
echo $2 #第二个参数,以此类推。
#其它内置变量:$*、$@、$?、$#
# $* 表示所有参数被双引号引住,等同"$1$2$3"。
# $@ 表示所有参数分别被双引号引住,等同于"$1" "$2" "$3"。
# $? 存储命令或程序的返回结果
# $# 该变量存储命令行上的参数个数
#反引号
echo hello world > /dev/pts/0
echo `tty` #反引号用于引用命令的执行结果
ls -l `tty` # tty命令功能为查看当前终端号,即本终端对应 /dev/pts/ 目录下的哪个数字。tty执行后,然后执行ls -l查看该设备文件的属性。
# $() ,和反引号作用相同
ls -l $(tty)
2.sh:算术运算符
#!/bin/bash
#shell中的算术运算符:
# +、-、*、/、%、**、+=、-=、*=、/=、%=
#**:幂运算,如2**3为求2的3次幂。
#shell中令表达式做数学运算,有4种方式:expr、let、$[]、$(())
#1、expr指令
echo 1+2 #直接输出字符串1+2
echo `expr 1 + 2` #输出1+2的和,expr命令的语法规定:操作数与运算符间须以空格分隔
#2、let指令
let sum=4+6 #let命令使4+6的和赋给sum,而不是将字符串4+6赋给sum。+号左右不能有空格。
echo $sum
#3、$[ ]
echo $[7+4] #$[ ]表示中括号中的表达式作数学运算
#4、$(())
echo $((5+5))
3.sh:输入输出
#!/bin/bash
#input/output
#echo命令用于输出
string="I love you!"
echo $string > file1
str=what?
echo $str >> file1
str="What are you doing?"
echo -e "\n\t$str" #echo -e选项启动识别转义字符,且含转义字符的字符串要用双引号括起来,\n为换行符,\t等同tab键。
echo \$$$$$ #\为转义符,直接输出其后$符号。
#read命令用于读取输入,可从键盘输入读,也可从文件中读
read str #读取键盘输入值到str变量中
echo $str
read str1 str2 str3 #从键盘读取多个输入,输入以空格分割分别赋给三个变量。
echo $str1 $str2 $str3
read str1 str2 #如果输入为a b c d,则a赋给str1,b、c、d都赋给str2
echo $str1 $str2
read str4 str5 str6 < file1 #从文件file1中读取
echo $str4 $str5 #str4为 I,str5为 love,str6为 you!
4.sh:测试命令
#!/bin/bash
#test命令用于测定变量和字符串的大小、文件属性
#test命令返回0表示真,返回1表示假
#测试文件属性
#格式:test 文件属性测试符 文件路径
#文件属性测试符:
# -d:测试文件是否为目录,-s:测试文件是否非空,-f:测试文件是否为正规文件
# -w:测试文件是否可写,-L:测试文件是否是符号链接,-u:测试文件是否有设置suid位
# -x:测试文件是否可执行,-r:测试文件是否可读
test -x ./file1 #测试当前目录下的file1是否可执行
echo $? #$?是一个特殊变量,用于保存上个命令的返回值
test -x ./file1
echo $?
#数值测试:test命令、中括号[]
#test命令格式:test 操作数1 数值比较符 操作数2
#中括号[]格式: [ 操作数1 数值比较符 操作数2 ] #靠近中括号都必须留空格
#数值比较符:
# -eq:相等, -ne:不相等,
# -le: 小于等于,-ge:大于等于
# -gt:大于, -lt:小于等于
test 3 -eq 5
echo $?
[ 10 -lt 12 ]
echo $?
#字符串测试
#格式1:[test] 字符串比较符 字符串
#格式2:[test] 字符串1 字符串比较符 字符串2
#[]表示为可省略项
#字符串测试符:
# =:测试两个字符串是否相等,也可使用==
# !=:测试两个字符串是否不相等
# -z:测试字符串是否空字符串
# -n:测试字符串是否非空字符串
str1=aaa
str2=bbb
test str1 == str2 # 也可写为test str1 = str2,但为与大多数高级语言的语法习惯保持一致,推荐使用==
echo $?
#逻辑测试
# -a:逻辑与,-o:逻辑或,!:逻辑非
[ -w file1 -a -x file1 ] # test -w file1 -a -x file1 #测试文件file1是否可写且可执行
echo $?
5.sh:流程控制—if
#!/bin/bash
#shell流程控制:if、for、until
#if
#一个分支
if [ $1 -eq 0 ]
then echo I love you!
fi
#两个分支
if [ $2 -lt 0 ]
then echo I hate you!
else
echo I love you very much!
fi
#三个分支
if [ $3 -gt 0 ]; then
echo good!
elif [ $3 -eq 0 ]; then
echo common!
else
echo bad!
fi
6.sh:流程控制—for
#!/bin/bash
#for
#example1,ch依次取关键字in后的值
for ch in a b c d e 1 2 3 567
do
echo $ch
done
#example2, 省略关键字in,ch的值为命令行上的参数
for ch
do
echo $ch
done
7.sh:流程控制—until
#/bin/bash
#until format:
#until 条件 #直至条件满足才退出循环
#do
# 命令1
# ……
#done
#until示例,计算从1累加至100
i=1
sum=0
until [ sum -gt 100 ]
do
sum=$[$sum+$i]
done
echo sum = $sum