您的位置:首页 > 运维架构 > Shell

Shell变量及字符串的操作

2017-12-08 23:13 295 查看
#  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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  shell