(2.1)Linux Shell脚本的自动化编程之shell变量

1.变量的定义

  • 使用一个特定的字符串去表示不固定的内容

  • 自定义变量

定义变量:变量名=变量值 ,变量名必须以字母或者下划线开头,区分大小写
引用变量:$变量名或者${变量名}
查看变量:echo $变量名 set(所有变量:包括自定义变量和环境变量)
取消变量:unset变量名
作用范围:仅在当前shell中有效

# ip1=1.2.34.1
# echo $ip1
# 啥都没有
  • 环境变量:一般不是不去定义的
定义环境变量:
方法1:export back_dir2=/home/backip
方法2:export back_dir1将自定义变量转换成环境变量
引用环境变量:$变量名或者${变量名}
查看环境变量:echo $变量名 env eg:env|grep back_dir2
取消环境变量:unset 变量名
变量作用范围:在当前shell和子shell中有效

eg:没必要定义环境变量(父子shell都能使用的变量),因为可以在当前脚本中使用另外一个脚本
在public.sh中的内容是:
ip10=1.1.1.1
dir_path=/etc/wangji

在test1.sh中的内容是:
. public.sh   ##这里可以是相对路径,也可以是绝对路径,.表示在当前shell执行
echo "ip10 is: $ip10"
echo "dir_path is: $dir_path"
直接执行即可。
这样执行,没必要在public.sh中的末尾添加:export ip10 dir_path,让其变成环境变量

eg:如何去更改系统环境变量,比如添加个/new/bin的路径?
vim /etc/profile
在最下面的一行输入:
PATH=$PATH:/new/bin
export PATH
保存,接着
source /etc/profile ##source表示在当前shell执行
echo $PATH

  • eg
变量的名称=变量的值
$变量的名称:表示引用变量的值

#!/usr/bin/bash
ip=10.18.42.1
ping -c1 $ip &>/dev/null && echo "$ip is up" || echo "$ip is down"

-----------------------------------------------------------------------------------
if和then都是命令(准确的是关键字,可通过type -a if,或者type -a if查看),两个命令摆在一起要使用;号。
所以写成:if ping -c1 $ip &>/dev/null; then
ping -c1 $ip &>/dev/null也是命令

#!/usr/bin/bash
ip=10.18.42.1
if ping -c1 $ip &>/dev/null; then ##或者写成:if ping -c1 $ip &>/dev/null
	echo "$ip is up"			  		   ##then
else
	echo "$ip is down"
fi

----------------------------------------------------------------------------------

#!/usr/bin/bash
ip=10.18.42.1
ping -c1 $ip &>/dev/null 
if [ $? -eq 0 ];then
	echo "$ip is up"			  	
else
	echo "$ip is down"
fi
	
----------------------------------------------------------------------------------

#!/usr/bin/bash
read -p "Please input ip: " ip ##变量的值从键盘读入
ping -c1 $ip &>/dev/null 
if [ $? -eq 0 ];then
	echo "$ip is up"			  	
else
	echo "$ip is down"
fi

----------------------------------------------------------------------------------
$1是位置变量

#!/usr/bin/bash
ping -c1 $1 &>/dev/null 
if [ $? -eq 0 ];then
	echo "$1 is up"			  	
else
	echo "$1 is down"
fi
  • 位置变量
$1 $2 $3 ${4}
  • 预定义变量
$0 脚本名
$* 所有的参数
$@ 所有的参数
$# 参数的个数
$$ 当前进程的PID
$! 上一个后台进程的PID
$? 上一个命令的返回值,0表示成功

eg:
在ip.txt文件中,填入的内容:
1.1.2.3
1.2.3.4
1.2.3.5

#!/usr/bin/bash
#提示方法,如果用户没有加参数
if [ $# -eq 0 ];then
	echo "uasge: 'basename $0' file"   #basename只显示最后一个名字,eg:basename /home/wangji/cc,只显示cc
fi

##判断是否为文件
if [ ! -f $1 ];then
	echo "erro file!"
fi

for ip in 'cat $1'
do
	ping -c1 $ip &>dev/null
	if [ $? -eq 0 ];then
		echo "$ip is up"
	else
		echo "$ip is down"
	if
done

执行的话: ./ping01.sh /etc/ip.text

2.变量的赋值

  • shell默认将变量看成是字符串类型
  • 显示赋值
变量名=变量值
eg:
ip1=1.1.1.2
school="Wangji hello"
today=`data+%F;echo $today` ##``代表反引号,叫做命令替换(先把命令执行一遍,再做别的事情),等价于today=(data+%F)
today=$(data+%F)

##上面的结果都是将字符串直接或者间接的赋值给变量
  • read从键盘读入变量值
read以空格分隔
read 变量名
read -p "提是信息: " 变量名
read -t 5 -p "提是信息: " 变量名  ## -t 5表示:等待5s的时间
read -n 2 变量名

eg:
#!/usr/bin/bash 
read -p "输入名 年龄[eg: zhangsan 20]:" name age
echo "名字是:$name,年龄是:$age"
  • 单引号和双引号的区别
""弱引用
''强引用,是啥就是啥,没有变量

eg:
name="wang ji"
boy="$name is good";echo $boy
wang ji is good
boy='$name is good';echo $boy
$name is good
  • ``反引号
``反引号:命令替换,等价于$(),反引号中的shell命令会被先执行

eg:
touch `date+%F`_file.txt等价于touch (date+%F)_file.txt
disk1=“df -h|grep '/$'|awk '{print $4}'”
echo $disk1没结果,这是因为双字符串的原因,他并不会执行这条命令

要改成:
disk1=`df -h|grep '/$'|awk '{print $4}'`
echo $disk1
或者
disk1=(df -h|grep '/$'|awk '{print $4}')
echo $disk1



发布了510 篇原创文章 · 获赞 134 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/u011436427/article/details/103842738