shell学习05:shell特殊参数、shell字符串


1. shell特殊参数

echo 符号 说明
$# 获取脚本传参的个数
$*$@ 表示参数列表中的所有参数
$? 用来获取上一个命令的退出状态,或者上一个函数的返回值
${#str} 获取字符串长度
[kiosk@foundation60 shell特殊参数]$ cat 01.sh 
#!/bin/bash
echo $1,$2
[kiosk@foundation60 shell特殊参数]$ sh 01.sh zjy haha
zjy,haha
  • 当位置参数的数字大于9时,需要用大括号将数字括起来。
[kiosk@foundation60 shell特殊参数]$ echo \${1..15}
$1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15
[kiosk@foundation60 shell特殊参数]$ cat 02.sh 
#!/bin/bash
echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} ${15}
[kiosk@foundation60 shell特殊参数]$ sh 02.sh {a..z}
a b c d e f g h i j k l m n o
  • 获取脚本的名称及路径。若不带路径执行脚本,输出结果就是脚本的名字;若使用全路径执行脚本,输出结果就是全路径加上脚本的名字。
# 不带路径执行脚本
# $0:表示当前脚本名
[kiosk@foundation60 shell特殊参数]$ cat 03.sh 
echo $0
[kiosk@foundation60 shell特殊参数]$ sh 03.sh 
03.sh
# 带路经执行脚本
[kiosk@foundation60 shell特殊参数]$ dirname /home/kiosk/Desktop/shell/1-14/20200114-shell/day01/shell特殊参数/03.sh  ## dirname:取脚本所在的绝对路径
/home/kiosk/Desktop/shell/1-14/20200114-shell/day01/shell特殊参数
[kiosk@foundation60 shell特殊参数]$ basename /home/kiosk/Desktop/shell/1-14/20200114-shell/day01/shell特殊参数/03.sh  ## 取脚本名称
03.sh
[kiosk@foundation60 shell特殊参数]$ cat 04.sh 
#!/bin/bash
dirname $0
basename $0
[kiosk@foundation60 shell特殊参数]$ sh /home/kiosk/Desktop/shell/1-14/20200114-shell/day01/shell特殊参数/04.sh
/home/kiosk/Desktop/shell/1-14/20200114-shell/day01/shell特殊参数
04.sh
  • 通过$#获取脚本传参的个数
[kiosk@foundation60 shell特殊参数]$ cat 05.sh 
#!/bin/bash
echo $1 $2 $3 $4 $5 $6 $7 $8 $9
echo $#   
[kiosk@foundation60 shell特殊参数]$ sh 05.sh {a..z}
a b c d e f g h i  # 接受了9个变量,所以打印了9个字符
26  # 传入26个参数
  • $*$@的区别:在linux shell中,$*$@都是表示参数列表中的所有参数。
[kiosk@foundation60 shell特殊参数]$ cat 06.sh 
#!/bin/bash
foo(){
	echo $*

}

bar(){
	echo $@

}

foo 1 2 3 4
bar 1 2 3 4
[kiosk@foundation60 shell特殊参数]$ sh 06.sh 
1 2 3 4
1 2 3 4
  • 但是当$*$@被双引号(" ")包含时,"$*"会将所有的参数作为一个整体,以"$1 $2 $3 $4 ..."的形式输出所有的参数; "$@"会将各个参数分开,以"$1" "$2" "$3"...的形式输出所有参数。
[kiosk@foundation60 shell特殊参数]$ cat 07.sh 
#!/bin/bash
test(){
	echo "未加引号"
	echo $*
	echo $@
	echo "加入引号"
	echo "-------"
	for N in "$*"
	do
		echo $N
	done

	echo "########"
	for N in "$@"
	do
		echo $N
	done

}
test 11 22 33
[kiosk@foundation60 shell特殊参数]$ sh 07.sh 
未加引号
11 22 33
11 22 33
加入引号
-------
11 22 33
########
11
22
33
  • shift命令用于对参数的移动(左移),通常用于在不知道传入参数个数的情况下依次遍历每个参数然后进行相应处理。
[kiosk@foundation60 shell特殊参数]$ cat 08.sh 
#!/bin/bash

while [ $# != 0 ];do
echo "第一个参数为:$1,参数的个数为:$#"
shift  为什么?
done
[kiosk@foundation60 shell特殊参数]$ sh 08.sh a b c d e f
第一个参数为:a,参数的个数为:6
第一个参数为:b,参数的个数为:5
第一个参数为:c,参数的个数为:4
第一个参数为:d,参数的个数为:3
第一个参数为:e,参数的个数为:2
第一个参数为:f,参数的个数为:1

# shift【shift 1】命令每执行一次,变量的个数($#)减一(之前的$1变量被销毁,之后的$2就变成了$1),而变量值提前一位
  • $?用来获取上一个命令的退出状态,或者上一个函数的返回值。
[kiosk@foundation60 shell特殊参数]$ cat 09.sh 
#!/bin/bash
if [ "$1" == 100 ] 
then
	exit 3  #参数正确 退出状态为0
else
	exit 1 #参数不正确 退出状态为1
fi
[kiosk@foundation60 shell特殊参数]$ sh 09.sh 100
[kiosk@foundation60 shell特殊参数]$ echo $?   
3
[kiosk@foundation60 shell特殊参数]$ cat 10.sh 
#!/bin/bash
add(){
	return `expr $1 + $2`

}
add 23 50 #调用函数
echo $?

[kiosk@foundation60 shell特殊参数]$ sh 10.sh 
73

2. shell字符串

[kiosk@foundation60 shell字符串]$ cat 01.sh 
#!/bin/bash
n=88
str1=www.baidu.com$n str2="shell \"stript\" $n"  # \表示转义字符
str3="你好 $n"
echo $str1
echo $str2
echo $str3
[kiosk@foundation60 shell字符串]$ sh 01.sh 
www.baidu.com88
shell "stript" 88
你好 88
  • ${#str}:获取字符串长度
[kiosk@foundation60 shell字符串]$ cat 02.sh 
#!/bin/bash
str="http://www.baidu.com/shell"
echo ${#str}
[kiosk@foundation60 shell字符串]$ sh 02.sh 
26
  • 字符串拼接
[kiosk@foundation60 shell字符串]$ cat 03.sh 
#!/bin/bash
name="shell"
url="http://www.taobao.com"
str1=$name$url # 中间不能有空格
str2="$name $url" #如果被双引号包围 那么中间可以有空格
str3=$name" : "$url #中间可以出现别的字符
str4="$name : $url"
str5="${name}Script : ${url}index.html" # 加{ }是为了帮助解释器识别变量的边界
echo $str1
echo $str2
echo $str3
echo $str4
echo $str5
[kiosk@foundation60 shell字符串]$ sh 03.sh 
shellhttp://www.taobao.com
shell http://www.taobao.com
shell : http://www.taobao.com
shell : http://www.taobao.com
shellScript : http://www.taobao.comindex.html
  • 字符串的截取,从指定位置开始截取。注意:从左边开始计数时,开始数字是0;从右边开始计数时,其实数字是1。

   1)从字符串左边开始计数:${string: start: length},其中string是要截取的字符串,start是起始位置(从左边开始,从0开始计数),length是要截取的长度(省略的话表示直到字符串的末尾)

# 从位置2开始往后取9位   ${string:0-start:length}
[kiosk@foundation60 shell字符串]$ url="www.baidujjjjj.com"
[kiosk@foundation60 shell字符串]$ echo ${url:2:9}
w.baidujj
[kiosk@foundation60 shell字符串]$ echo ${url:2}
w.baidujjjjj.com

   2)从右边开始计数:${string: 0-start: length}

[kiosk@foundation60 shell字符串]$ echo ${url:0-13}
aidujjjjj.com
[kiosk@foundation60 shell字符串]$ echo ${url:0-13:9}
aidujjjjj
  • 从指定字符开始截取

   1) 截取右边字符串(遇到第一个匹配的字符就结束):${string#*chars},其中,string表示要截取的字符,chars是指的字符,*是通配符的一种,表示任意长度的字符串。*chars连起来使用的意思是:忽略左边的所有字符,直到遇见chars(chars不会截取)。

[kiosk@foundation60 shell字符串]$ url="http://www.baidu.com/shell/python"
[kiosk@foundation60 shell字符串]$ echo ${url#*:}
//www.baidu.com/shell/python
[kiosk@foundation60 shell字符串]$ echo ${url#*ttpp:}
http://www.baidu.com/shell/python
[kiosk@foundation60 shell字符串]$ echo ${url#*ttp:}
//www.baidu.com/shell/python
[kiosk@foundation60 shell字符串]$ echo ${url#*/}
/www.baidu.com/shell/python

   2) 直到最后一个指定字符再匹配结束,可以使用##:${string##*chars}

[kiosk@foundation60 shell字符串]$ echo ${url##*/}
python
[kiosk@foundation60 shell字符串]$ cat 04.sh 
#!/bin/bash
url="http://www/taobao.com/book/shell"
echo ${url#*/}
echo ${url##*/}
str="---aa+++aa@@@"
echo ${str#*aa} 
echo ${str##*aa}
[kiosk@foundation60 shell字符串]$ sh 04.sh 
/www/taobao.com/book/shell
shell
+++aa@@@
@@@
发布了106 篇原创文章 · 获赞 1 · 访问量 2363

猜你喜欢

转载自blog.csdn.net/weixin_43384009/article/details/104126544