Shell变量及字符串的操作

#  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脚本时,向脚本内获取参数的格式为:$nn代表一个数字,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


#   $*$@ 的区别:

# 相同点: 都是引用所有参数

# 不同点: 只有在双引号体现出来。假设在脚本运行时写了三个参数123,则 " * "等价于 "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语言)