# Shell脚本运行的方法 1、 chmod +x ./xxx.sh -> ./xxx.sh ()
# 2、/bin/sh xxx.sh /bin/php test.php
# 3、也可以在终端上 # !/bin/bash 然后就可以在终端敲Shell语句了
# echo 'Hello'
# Shell变量:
# 定义变量时,变量名不加美元符号($,PHP语言中变量需要),如:
#_your_name="baidu.com"
# 注意:变量名和符号之间不能有空格,同时,变量名的命名须遵守的规则:
# 1、首个字符必须是字母或者下划线_
# 2、中间不能有空格,可以使用下划线
# 3、不能使用标点符号
# 4、不能使用bash里的关键字
# 除了显式赋值,还可以用语句给变量赋值,
# for file in `ls/etc`
# 上面语句将/etc下目录的文件名循环出来
# 变量的使用,使用一个定义过的变量,只要在变量名前面加美元符号即可。
# echo $_your_name
# 或
# echo ${_your_name}
# 变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如
# for skill in Ada Coffe Action Java; do
# echo "I am good at ${skill}Script"
# done
# 如果不给skill加花括号,写成了echo "I am good at $skillScript",解释器就会把$skillScript当成一个变量(其值可能为空),因此推荐使用花括号
# 只读变量
# 使用readonly命令可以将变量定义为只读变量,只读变量的值不能改变。
# myurl="baidu.com"
# readonly myurl
# myurl="baidu"
# 运行会报错: myurl: readonly variable
# 删除变量
# 使用unset命令可以删除变量,语法: unset variable_name
# 变量被删除后不能再次使用。unset不能删除只读变量,否则会报错: unset: myurl: cannot unset: readonly variable
# Shell字符串,字符串可以用单引号,也可以用双引号,也可以不用引号
# str='this is a string'
# 单引号字符串的限制:1、单引号里的任何字符都会原样输出,单引号字符串中的变量时无效的;
# 2、单引号字符串不能出现单引号(对单引号使用转义符后也不行)
# your_name="Li Lei"
# string="Hello,I know you are $your_name! \n"
# echo ${string}
#双引号的优点:1、双引号里可以有变量;2、双引号里可以出现转义字符
#拼接字符串
# your_name="Li Lei"
# greeting="Hello,"$your_name"!"
# greeting1="Hello,${your_name}!"
# echo $greeting$greeting1
#获取字符串长度 ${#variable_name}
#string="abcd efg her"
# echo ${#string}
#提取子字符串 ${variable_name:index:length} index表示字符下标
# echo ${string:2:6} #从第三个字符开始的6个字符
# echo ${string:2} #第三个开始的所有字符
# echo ${string:2 :${#string}-2} #第三个开始的所有字符
#查找子字符串
# string="baidu is duniang"
# echo `expr index "$string" is` # 7
# 注意上面的脚本中 ` 是反引号,而不是单引号
# Shell 数组
#bash支持一维数组(不支持多维数组),并且没有限定数组的大小
#定义数组 数组名=(值1 值2 值3 ... 值n),数组元素之间用空格隔开
# 也可以单独定义数组的各个分量: arr[0]=value0 arr[1]=value1
# 可以不使用连续的下标,而且下标的范围没有限制
# 读取数组 读取数组元素值得一般格式是: ${数组名[下标]}
# 读取数组所有元素, ${数组名[@]}
# 获取数组的长度,与获取字符串长度相同
# 取得数组元素的个数 ${#arr[@]}、${#arr[*]}
# arr=(122 33 54 7422 9)
# length=${#arr[@]}
# echo ${length}
# 取得数组单个元素的长度 ${#arr[n]}
# Linux的字符串截取很有用,有八种方法:
#1、#号截取,删除左边字符,保留右边字符
# var="http://www.baidu.com"
# echo ${var#*//} # #号是运算符,*//表示从左边开始删除第一个//号及左边的所有字符,输出结果www.baidu.com
#2、##号截取,删除左边字符保留右边字符
# echo ${var##*/} # ##*/表示从左边开始删除最后一个/号及左边的所有字符
#3、%号截取,删除右边字符,保留左边字符
# echo ${var%/*} # %/* 表示从右边开始,删除第一个/号及右边的字符
#4、%%号截取,删除右边字符,保留左边字符
# echo ${var%%/*} # 表示从右边开始,删除最有一个/号及其右边的字符
# 5、从左边第几个字符开始,及字符的个数
# echo ${var:0:5} # 0 -- 左边第一个字符开始;5 -- 字符的总个数
# 6、从左边第一个字符开始,一直到结束
# echo ${var:7}
# 7、从右边几个字符开始及字符的个数
# echo ${var:0-7:3} # 0-7 (idu.com)--> 表示右边算起第七个字符开始,3 --> 字符的个数,输出:idu
# 8、从右边第几个字符开始,一直到结束
# echo ${var:0-7} #右边算起第七个字符开始,输出:idu.com
# #、## 表示从左边开始删除。一个 # 表示从左边删除到第一个指定的字符;两个 # 表示从左边删除到最后一个指定的字符;
# %、%% 表示从右边开始删除。一个 % 表示从右边删除到第一个指定的字符;两个 % 表示从左边删除到最后一个指定的字符。删除包括了指定的字符本身
# Shell传递参数 我们可以在执行Shell脚本时,向脚本内获取参数的格式为:$n。n代表一个数字,1为执行脚本的第一个参数,2为执行脚本的第二个参数,以次类推。。。
{
echo "执行文件名 : $0"
echo "第一个参数:$1"
echo "第二个参数:$2"
}
# 终端 chmod +x test.sh -> ./test.sh 1 2 输出结果 :
# 执行文件名 : ./test1.sh
# 第一个参数:1
# 第二个参数:2
##############################
# 其他几个特殊字符用来处理参数:
# $# -- 传递到脚本的参数个数
# $* -- 以一个单字符串显示所有向脚本传递的参数
# $$ -- 脚本运行的当前进程ID号
# $! -- 后台运行的最后一个进程的ID号
# $@ -- 与$*相同,但是使用时加引号,并在引号中返回每个参数。
# $- -- 显示Shell使用的当前选项,与 set 命令功能相同。
# $? -- 显示最后命令的退出状态。0 表示没有错误,其他任何值表示由错误。
echo "第一个参数:$1"
echo "参数个数: $#"
echo "传递的参数作为一个字符串显示: $*"
# 终端 chmod +x test.sh -> ./test1.sh 14 23 输出结果 :
# 第一个参数:14
# 参数个数: 2
# 传递的参数作为一个字符串显示: 14 23
# $*和$@ 的区别:
# 相同点: 都是引用所有参数
# 不同点: 只有在双引号体现出来。假设在脚本运行时写了三个参数1、2、3,则 " * "等价于 "1 2 3"(传递了一个参数)
# 而"@"等价于 "1" "2" "3"(传递了三个参数) 。
echo "-- \$* 演示 ---"
for i in "$*"; do
echo $i
done
echo "-- \$@ 演示 ---"
for i in "$@"; do
echo $i
done
# 执行结果:
# -- $* 演示 ---
# 14 23
# -- $@ 演示 ---
# 14
# 23