shell 变量是用一个固定的字符串去表示不固定的内容,便于修改。
==变量类型==
自定义变量 环境变量 位置变量和预定义变量
=自定义变量=
A. 特性
1. 自定义变量(示例:ping01.sh引入变量)
定义变量: 变量名=变量值 变量名必须以字母或下划线开头,区分大小写 ip1=192.168.2.115
引用变量: $变量名 或 ${变量名}
查看变量: echo $变量名; "set"可以查看所有变量(包括自定义变量和环境变量)
取消变量: unset 变量名
作用范围:
仅在当前shell中有效
B. 示例:
使用变量前。麻烦
ping -c1 192.168.100.10 &>/dev/null && echo 192.168.100.10up || echo 192.168.100.10down
使用变量后,简洁
#!/bin/bash
ip=192.168.100.10
ping -c1 $ip &>/dev/null && echo $ip up || echo "$ip down"
C. 变量赋值(定义变量):
1. 显式赋值:变量名=变量值
示例:
ip1=192.168.1.251
school="BeiJing 1000phone"
today1=`date +%F`
today2=$(date +%F)
2. read 从键盘读入变量值
read 变量名
read -p "提示信息: " 变量名
read -t 5 -p "提示信息: " 变量名 //-t 等待5秒,后超时
read -n 2 变量名 //-n 只记录几个字符
示例:
read -p "请输入您测试的IP地址:" ip
ping -c1 $ip &>/dev/null && echo " $ip up" || echo "$ip down"
=环境变量(了解)=
定义环境变量: 方法一 export back_dir2=/home/backup
方法二 export back_dir1 将自定义变量转换成环境变量
引用环境变量: $变量名 或 ${变量名}
查看环境变量: echo $变量名 env 例如env |grep back_dir2
取消环境变量: unset 变量名
变量作用范围: 在当前shell和子shell有效 !!!
使变量开机、登陆生效,将变量放到~/.bash_profile
永久生效:写到四个登录脚本,/etc/profile ~/.baserc ~/.bash_profile /etc/bashrc
=位置变量和预定义变量(了解)=
语法命令 参数1 参数2 参数3 ....9以后特殊定义
$1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ...
预先定义过的变量
$0 脚本名
$* 所有的参数
$@ 所有的参数
$# 参数的个数
$$ 当前进程的PID
$! 上一个后台进程的PID
$? 上一个命令的返回值 0表示成功
示例
准备工作:
# vim test.sh
#!/usr/bin/bash
echo "第2个位置参数是$2"
echo "第1个位置参数是$1"
echo "第4个位置参数是$4"
echo "所有参数是: $*"
echo "所有参数是: $@"
echo "参数的个数是: $#"
echo "当前进程的PID是: $$"
echo '$1='$1
echo '$2='$2
echo '$3='$3
echo '$*='$*
echo '$@='$@
echo '$#='$#
echo '$$='$$
演示结果如下:
[root@localhost ~]# chmod +x test.sh
[root@localhost ~]# ./1.sh 1 2 3 4 5 6 7 8 9
第2个位置参数是2
第1个位置参数是1
第4个位置参数是4
所有参数是: 1 2 3 4 5 6 7 8 9
所有参数是: 1 2 3 4 5 6 7 8 9
参数的个数是: 9
当前进程的PID是: 1946
$1=1
$2=2
$3=3
$*=1 2 3 4 5 6 7 8 9
$@=1 2 3 4 5 6 7 8 9
$#=9
$$=1946
$*和$@区别(资料)
shell中$*与$@的区别
关于$* 和 $@的 一点 认识 同是菜鸟一起学习
$* 所有的位置参数,被作为一个单词.
注意:"$*"必须被“”引用.
$@ 与$*同义,但是每个参数都是一个独立的""引用字串,
这就意味着参数被完整地传递,并没有被解释和扩展.这也意味着,每个参数列表中的每个参数都被当成一个独立的单词.
注意:"$@"必须被“”引用.
$@ $* 只在被双引号包起来的时候才会有差异
双引号括起来的情况:
$*将所有的参数认为是一个字段
$@以IFS(默认为空格)来划分字段,如果空格在“”里面,不划分。采用LS的脚本运行./test 1 "2 3" 4 来发现差异
没有括起来的情况是$@和$*一样的,见到IFS就划分字段。还是采用LS的脚本运行./test 1 "2 3" 4 来发现差异
一个小例子 ,仅供参考
[Copy to clipboard] [ - ]CODE:#!/bin/bash
echo
index=1
echo "Listing args with\"\$*\":"
for arg in "$*"
do
echo "Arg #$index=$arg"
let "index+=1"
done
echo "所有的参数被认为是一个单词"
echo
index=1
echo "Listing args with \"\$@\":"
for arg in "$@"
do
echo "Arg #$index=$arg"
let "index+=1"
done
echo "所有的参数被认为是各个独立的单词"
echo
index=1
网友评论