Shell 教程 | Shell 传递参数 |
定义变量时,变量名不加美元符号($,PHP语言中变量需要),如:
your_name="w3cdata.com"
注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:
有效的 Shell 变量名示例如下:
RUNOOB LD_LIBRARY_PATH _var var2
无效的变量命名:
?var=123 user*name=w3cdata
除了显式地直接赋值,还可以用语句给变量赋值,如:
for file in `ls /etc` 或 for file in $(ls /etc)
以上语句将 /etc 下目录的文件名循环出来。
使用一个定义过的变量,只要在变量名前面加美元符号即可,如:
your_name="qinjx" 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当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。
推荐给所有变量加上花括号,这是个好的编程习惯。
已定义的变量,可以被重新定义,如:
your_name="tom" echo $your_name your_name="alibaba" echo $your_name
这样写是合法的,但注意,第二次赋值的时候不能写$your_name="alibaba",使用变量的时候才加美元符($)。
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
下面的例子尝试更改只读变量,结果报错:
#!/bin/bash myUrl="https://www.google.com" readonly myUrl myUrl="https://www.w3cdata.com"
运行脚本,结果如下:
/bin/sh: NAME: This variable is read only.
使用 unset 命令可以删除变量。语法:
unset variable_name
变量被删除后不能再次使用。unset 命令不能删除只读变量。
实例
#!/bin/sh myUrl="https://www.w3cdata.com" unset myUrl echo $myUrl
以上实例执行将没有任何输出。
运行shell时,会同时存在三种变量:
字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。
str='this is a string'
单引号字符串的限制:
your_name='w3cdata' str="Hello, I know you are \"$your_name\"! \n" echo -e $str
输出结果为:
Hello, I know you are "w3cdata"!
双引号的优点:
your_name="w3cdata" # 使用双引号拼接 greeting="hello, "$your_name" !" greeting_1="hello, ${your_name} !" echo $greeting $greeting_1 # 使用单引号拼接 greeting_2='hello, '$your_name' !' greeting_3='hello, ${your_name} !' echo $greeting_2 $greeting_3
输出结果为:
hello, w3cdata ! hello, w3cdata ! hello, w3cdata ! hello, ${your_name} !
string="abcd" echo ${#string} #输出 4
以下实例从字符串第 2 个字符开始截取 4 个字符:
string="w3cdata is a great site" echo ${string:1:4} # 输出 unoo
注意:第一个字符的索引值为 0。
查找字符 i 或 o 的位置(哪个字母先出现就计算哪个):
string="w3cdata is a great site" echo `expr index "$string" io` # 输出 4
注意: 以上脚本中 ` 是反引号,而不是单引号 ',不要看错了哦。
bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
类似于 C 语言,数组元素的下标由 0 开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0。
在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:
数组名=(值1 值2 ... 值n)
例如:
array_name=(value0 value1 value2 value3)
或者
array_name=( value0 value1 value2 value3 )
还可以单独定义数组的各个分量:
array_name[0]=value0 array_name[1]=value1 array_name[n]=valuen
可以不使用连续的下标,而且下标的范围没有限制。
读取数组元素值的一般格式是:
${数组名[下标]}
例如:
valuen=${array_name[n]}
使用 @ 符号可以获取数组中的所有元素,例如:
echo ${array_name[@]}
获取数组长度的方法与获取字符串长度的方法相同,例如:
# 取得数组元素的个数 length=${#array_name[@]} # 或者 length=${#array_name[*]} # 取得数组单个元素的长度 lengthn=${#array_name[n]}
以 # 开头的行就是注释,会被解释器忽略。
通过每一行加一个 # 号设置多行注释,像这样:
#-------------------------------------------- # 这是一个注释 # author:W3C 菜鸟 教程 # site:www.w3cdata.com # slogan:学的不仅是技术,更是梦想! #-------------------------------------------- ##### 用户配置区 开始 ##### # # # 这里可以添加脚本描述信息 # # ##### 用户配置区 结束 #####
如果在开发过程中,遇到大段的代码需要临时注释起来,过一会儿又取消注释,怎么办呢?
每一行加个#符号太费力了,可以把这一段要注释的代码用一对花括号括起来,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果。
多行注释还可以使用以下格式:
:<<EOF 注释内容... 注释内容... 注释内容... EOF
EOF 也可以使用其他符号:
:<<' 注释内容... 注释内容... 注释内容... ' :<<! 注释内容... 注释内容... 注释内容... !
Linux 的字符串截取很有用。有八种方法。
假设有变量 var=http://www.aaa.com/123.htm
1. # 号截取,删除左边字符,保留右边字符。
echo ${var#*//}
其中 var 是变量名,# 号是运算符,*// 表示从左边开始删除第一个 // 号及左边的所有字符
即删除 http://
结果是 :www.aaa.com/123.htm
2. ## 号截取,删除左边字符,保留右边字符。
echo ${var##*/}
##*/ 表示从左边开始删除最后(最右边)一个 / 号及左边的所有字符
即删除 http://www.aaa.com/
结果是 123.htm
3. %号截取,删除右边字符,保留左边字符
echo ${var%/*}
%/* 表示从右边开始,删除第一个 / 号及右边的字符
结果是:http://www.aaa.com
4. %% 号截取,删除右边字符,保留左边字符
echo ${var%%/*}
%%/* 表示从右边开始,删除最后(最左边)一个 / 号及右边的字符
结果是:http:
5. 从左边第几个字符开始,及字符的个数
echo ${var:0:5}
其中的 0 表示左边第一个字符开始,5 表示字符的总个数。
结果是:http:
6. 从左边第几个字符开始,一直到结束。
echo ${var:7}
其中的 7 表示左边第8个字符开始,一直到结束。
结果是 :www.aaa.com/123.htm
7. 从右边第几个字符开始,及字符的个数
echo ${var:0-7:3}
其中的 0-7 表示右边算起第七个字符开始,3 表示字符的个数。
结果是:123
8. 从右边第几个字符开始,一直到结束。
echo ${var:0-7}
表示从右边第七个字符开始,一直到结束。
结果是:123.htm
注:(左边的第一个字符是用 0 表示,右边的第一个字符用 0-1 表示)
#!bin/bash #author:amau var="http://www.w3cdata.com/linux/linux-shell-variable.html" s1=${var%%t*} s2=${var%t*} s3=${var%%.*} s4=${var#*/} s5=${var##*/}
echo "关于字符串的截取%,#的使用方法" echo "原字符串为:"${var} echo "%%t*的效果:"${s1} echo "%t*的效果:"${s2} echo "%%.*的效果:"${s3} echo "#*/的效果:"${s4} echo "##*/的效果:"${s5}
运行结果:
关于字符串的截取%,#的使用方法 原字符串为:http://www.w3cdata.com/linux/linux-shell-variable.html %%t*的效果:h %t*的效果:http://www.w3cdata.com/linux/linux-shell-variable.h %%.*的效果:http://www #*/的效果:/www.w3cdata.com/linux/linux-shell-variable.html ##*/的效果:linux-shell-variable.html
计算字符长度也可是使用 length:
string="hello,everyone my name is xiaoming" expr length "$string"
输出:34
注意:string字符串里边有空格,所以需要添加双引号
使用 expr 命令时,表达式中的运算符左右必须包含空格,如果不包含空格,将会输出表达式本身:
expr 5+6 // 直接输出 5+6 expr 5 + 6 // 输出 11
对于某些运算符,还需要我们使用符号"\"进行转义,否则就会提示语法错误。
expr 5 * 6 // 输出错误 expr 5 \* 6 // 输出30
它的语法形式一般是:
read [-options] [variable...]
以下实例读取键盘输入的内容并将其赋值给shell变量,为:-p 参数由于设置提示信息:
read -p "input a val:" a #获取键盘输入的 a 变量数字 read -p "input b val:" b #获取键盘输入的 b 变量数字 r=$[a+b] #计算a+b的结果 赋值给r 不能有空格 echo "result = ${r}" #输出显示结果 r
测试结果:
input a val:1 input b val:2 result = 3
自己来测试下 ###%%%* 的用法:
#!/bin/bash # 字符串截取(界定字符本身也会被删除) str="www.w3cdata.com/linux/linux-shell-variable.html" echo "str : ${str}" echo "str#*/ : ${str#*/}" # 从 字符串开头 删除到 左数第一个'/' echo "str##*/ : ${str##*/}" # 从 字符串开头 删除到 左数最后一个'/' echo "str%/* : ${str%/*}" # 从 字符串末尾 删除到 右数第一个'/' echo "str%%/* : ${str%%/*}" # 从 字符串末尾 删除到 右数最后一个'/' echo echo "str#/* : ${str#/*}" # 无效果 echo "str##/* : ${str##/*}" # 无效果 echo "str%*/ : ${str%*/}" # 无效果 echo "str%%*/ : ${str%%*/}" # 无效果
输出结果:
str : www.w3cdata.com/linux/linux-shell-variable.html str#*/ : linux/linux-shell-variable.html str##*/ : linux-shell-variable.html str%/* : www.w3cdata.com/linux str%%/* : www.w3cdata.com str#/* : www.w3cdata.com/linux/linux-shell-variable.html str##/* : www.w3cdata.com/linux/linux-shell-variable.html str%*/ : www.w3cdata.com/linux/linux-shell-variable.html str%%*/ : www.w3cdata.com/linux/linux-shell-variable.html