shell中的变量

1.变量的定义

变量即在程序运行过程中它的值是允许改变的量
变量是用一串固定的字符来标示不固定的值的一种方法
变量是一种使用方便的占位符,用于引用计算机内存地址,该地址可以存储Script运行时可更改的程序信息
在shell中变量是不能永久保存在系统中的,必须在文件中声明

2.变量的种类

·在shell中变量分为环境级变量,用户级变量,系统级变量。
·环境级变量只在当前shell中生效,shell关闭变量丢失
·用户级变量写在用户的骨文件中,只针对当前用户生效
·系统级变量被写在系统的配置文件/etc/profile或者/etc/profile.d/中,对于所有用户都生效

3.变量的定义方法

1)环境级

如果直接定义a=1,在当前shell里直接执行echo $a,执行结果为1
但是把echo $a写进脚本里,执行脚本的时候,执行结果是空的
因为执行脚本的时候会重新开启一个shell,在新的shell没有定义a=1的值
所以要环境级变量export a=1
[root@localhost ~]# export a=1

这里写图片描述
关闭当前shell重新打开后变量丢失
这里写图片描述
2)用户级

[root@localhost ~]# vim ~/.bash_profile
export a=1
[root@localhost ~]# source ~/.bash_profile #刷新

这里写图片描述
切换用户变量丢失
这里写图片描述
3)系统级

[root@localhost ~]# vim /etc/profile
export a=1

这里写图片描述
切换用户变量仍然生效
这里写图片描述

4.变量名称的规范

变量名称中通常包含大小写字母,数字,下划线
变量名称格式
LINUX_CSDN
Linux_Csdn
linuX_Csdn

5.字符的转译和变量的声明

1)\    #转译单个字符
2""   #弱引用,批量转译
3''   #强引用,批量转译
""''的区别在于""不能转译"\","`","!","$"
4${}  #变量声明

例子:
1)\ 转译单个字符
这里写图片描述
2)双引号与单引号的区别

[root@localhost ~]# echo '#########`hostname`#########'
#########`hostname`#########
[root@localhost ~]# echo "#########`hostname`#########"
#########localhost#########

单引号将`符号转译为普通字符和hostname一起输出,双引号没有转译这个符号的功能,所以执行了hostname这个命令然后输出了主机名
这里写图片描述

5.变量值传递

$1   脚本后的第一串字符串
$2   脚本后的第二串字符串
$3   脚本后的第三串字符串
$#   脚本后的字符串的个数
$*   脚本后的所有字符串,模式为“1 2 3$@   脚本后的所有字符串,模式为“1”“2”“3

例如:

[root@localhost mnt]# vim file.sh
#!/bin/bash
echo \$1 is $1
echo \$2 is $2
echo \$3 is $3
echo \$# is $#
echo \$* is $*
echo \$@ is $@
[root@localhost mnt]# sh file.sh 
[root@localhost mnt]# sh file.sh linux
[root@localhost mnt]# sh file.sh linux lin
[root@localhost mnt]# sh file.sh linux lin li

这里写图片描述

$*与$@的区别举例:
[root@localhost mnt]# vim file1.sh
#!/bin/bash
for name in "$*"
do
   echo $name
done
[root@localhost mnt]# vim file2.sh
#!/bin/bash
for name in "$@"
do
   echo $name
done
[root@localhost mnt]# sh -x file2.sh linux lin li   --->执行了三次
[root@localhost mnt]# sh -x file1.sh linux lin li   --->执行了一次

这里写图片描述

例子:
建立用户,用户名为userfile文件的内容,密码为passwordfile文件里的内容并判断脚本后字符串的个数是否为两个

[root@localhost mnt]# vim user_create.sh 
#!/bin/bash
[ "$#" -eq 2 ]||{
         echo please input userfile and passwordfile!!
         exit 1
}
MAX_LINE=`wc -l $USERFILE|cut -d " " -f 1`
for LINE_NUM in `seq 1 $MAX_LINE`
do
    USERNAME=`sed -n "${LINE_NUM}P" $USERFILE`
    PASSWORD=`sed -n "${LINE_NUM}P" $PASSFILE`
    useradd $USERNAME
    echo $PASSWORD | passwd --stdin $USERNAME
done

这里写图片描述
脚本内容:
这里写图片描述

6.read实现变量传递

例1:判断输入的ip主机是否开启

[root@localhost mnt]# vim ip_check.sh
#!/bin/bash
read -p "Please input a number: " IP    #如果不想显示输入的IP地址,可以加-s
ping -c1 -w1 $IP &> /dev/null && echo $IP is up || echo $IP is down
[root@localhost mnt]# sh ip_check.sh
Please input a number: 172.25.254.140
172.25.254.140 is down
[root@localhost mnt]# sh ip_check.sh
Please input a number: 172.25.254.152
172.25.254.152 is up

这里写图片描述
脚本内容:
这里写图片描述
例2:根据所输入用户名文件和密码文件建立用户,并判断输入的文件是否存在

[root@localhost mnt]# vim user_create.sh 
#!/bin/bash
read -p "Please input a userfile: " USERFILE
[ -e $USERFILE ]||{
         echo -e "\033[31m$USERFILE is not exist!!\033[0m"
         exit 1
}
read -p "Please input a passwordfile: " PASSWORDFILE
[ -e $PASSWORDFILE ]||{
         echo -e "\033[31m$PASSWORDFILE is not exist!!\033[0m"
         exit 1
}
MAX_LINE=`awk 'BEGIN{N=0}{N++}END{print N}' $USERFILE`
for LINE_NUM in `seq 1 $MAX_LINE`
do
     USERNAME=`sed -n "${LINE_NUM}p" $USERFILE`
     PASSWORD=`sed -n "${LINE_NUM}p" $PASSWORDFILE`
     useradd $USERNAME
     echo $PASSWORD | passwd --stdin $USERNAME
done

这里写图片描述
脚本内容:
这里写图片描述

7.别名设定

1) alias xie=’vim’ 关闭当前shell则失效

[root@localhost mnt]# alias xie=vim
[root@localhost mnt]# xie
[root@localhost mnt]# alias
alias xie='vim'

这里写图片描述
2) vim .bashrc 切换用户则失效

[root@localhost ~]# vim .bashrc 
[root@localhost ~]# source .bashrc 
[root@localhost ~]# alias
alias xie='vim'

这里写图片描述
切换用户失效
这里写图片描述
3) vim /etc/bashrc 切换用户仍然有效

[root@localhost ~]# vim /etc/bashrc 
[root@localhost ~]# source /etc/bashrc 
[root@localhost ~]# alias
alias xie='vim'

这里写图片描述
切换用户仍然有效
这里写图片描述
4)撤销设定:unalias xie
把文件里的别名设置删掉然后执行unalias
这里写图片描述

8.exit退出值

0 # 以一个真实值退出,表示正常退出
1 # 带假值退出
2 #用法不当
126 # 找到了要执行的文件,但它不是可执行的实用程序
127 # 未找到要执行的实用程序.
128 # 一个命令被一个信号打断了

例子:编写脚本利用exit退出值检测所输入ip的主机是否打开

[root@localhost mnt]# vim ip_check.sh 
read -p "please input an IP: " IP
ping -c1 -w1 $IP &> /dev/null
num=`echo $?`
[ "$num" = 0 ] &&{
    echo $IP is up
}||{
    echo $IP is down
}
[root@localhost mnt]# sh ip_check.sh
please input a IP: 172.25.254.222
172.25.254.222 is down
[root@localhost mnt]# sh ip_check.sh
please input a IP: 172.25.254.140
172.25.254.140 is up

这里写图片描述
脚本内容:
这里写图片描述

9.脚本中的函数

把一个复杂语句块定义成一个字符串的方法,可以让一个命令循环执行
例如:

[root@localhost mnt]# vim ip_check.sh 
#!/bin/bash
PING()
{
    read -p "Please input a number: " IP
    [ "$IP" = exit ]&&{
             echo bye
             exit 0
    }
    ping -c1 -w1 $IP &> /dev/null  &&{
      echo $IP is up
   }||{
      echo $IP is down
   }
   PING
}
PING
[root@localhost mnt]# sh ip_check.sh
Please input a number: 172.25.254.155
172.25.254.155 is up
Please input a number: 172.25.254.111
172.25.254.111 is down
Please input a number: exit
bye

执行如下:
这里写图片描述
脚本内容:
这里写图片描述

<think>好的,用户想知道如何在Shell脚本中正确调用和使用变量。首先,我需要回忆Shell变量的基本知识。根据引用[2],Bash中没有布尔类型,但可以用0和1来模拟。这可能是一个需要注意的点。 首先,变量声明。在Shell中,变量赋值不需要任何符号,直接等号,比如name="value"。但要注意等号两边不能有空格,否则会报错。这点需要强调,因为容易出错。 然后,调用变量的时候需要用$符号或者${}。比如$var或者${var}。后者在变量名后有其他字符时特别有用,可以避免歧义。比如${var}abc,这样就能正确解析变量名。引用[4]中的例子也用了$IP和$PORT,说明直接使用$变量名是常见做法。 接下来是变量的作用域。默认情况下,变量是局部的,只在当前Shell中有效。如果想在子Shell中使用,需要用export导出为环境变量。引用[1]提到,如果被调用的脚本在当前Shell执行,变量可以被主脚本获取,所以需要确认用户是否需要跨脚本使用变量。 另外,用户可能对字符串中的变量替换有疑问。比如如何在双引号和单引号中使用变量。双引号内变量会被替换,而单引号不会。例如echo "Hello $name"会替换变量,而echo 'Hello $name'则不会。引用[4]的例子中使用了单引号和双引号混合的情况,可能需要特别注意引号的嵌套。 还有,特殊变量如$0、$1、$#等,这些是Shell脚本中的位置参数和特殊变量,用户可能需要了解这些的使用方法。比如$1表示第一个参数,$#表示参数个数。 此外,变量的默认值和错误处理。比如${var:-default}表示如果var未设置或为空,使用默认值。这在脚本中处理未定义的变量时很有用,避免脚本出错。 最后,引用[3]提到了Shell的配置文件,如~/.profile,这些文件中的变量是在登录时加载的,可能影响脚本的环境变量。用户如果在脚本中遇到变量未定义的问题,可能需要检查环境变量的来源。 总结下来,用户的问题需要涵盖变量的声明、调用、作用域、引号使用、特殊变量、默认值设置以及环境变量配置等方面。需要结构清晰,逐步解释每个部分,并给出示例代码帮助理解。</think>### 如何在 Shell 脚本中调用和使用变量 #### 1. **变量声明与赋值** 在 Shell 脚本中,变量声明无需指定类型,直接通过等号赋值,且等号两侧不能有空格。例如: ```bash name="Alice" # 字符串变量 count=10 # 整型变量 failed=0 # 模拟布尔变量:0 表示 False,1 表示 True[^2] ``` #### 2. **变量调用** - **直接调用**:使用 `$` 符号引用变量: ```bash echo $name # 输出 Alice ``` - **明确作用域**:若变量名后紧跟其他字符,需用 `${}` 包裹变量名以避免歧义: ```bash echo "Value: ${count}th" # 输出 Value: 10th ``` #### 3. **变量作用域** - **局部变量**:默认仅在当前 Shell 中有效。 - **环境变量**:使用 `export` 声明后可在子进程中访问: ```bash export PATH="/usr/local/bin:$PATH" # 修改环境变量 ``` #### 4. **字符串中的变量调用** - **双引号内解析变量**:双引号允许变量替换,单引号则保持原样: ```bash echo "Hello $name" # 输出 Hello Alice echo 'Hello $name' # 输出 Hello $name ``` - **复杂场景示例**(如引用[4]的代码片段): ```bash IP="192.168.1.1" PORT=8080 php -r '$sock=fsockopen("'$IP'",'$PORT');' # 变量嵌入字符串中 ``` #### 5. **特殊变量** - **位置参数**:`$0`(脚本名)、`$1`(第一个参数)、`$#`(参数个数)等。 - **返回值**:`$?` 表示上一条命令的退出状态。 #### 6. **默认值与错误处理** - **设置默认值**:`${var:-default}` 表示若 `var` 未定义或为空,则使用 `default`: ```bash echo ${name:-"Unknown"} # 若 name 未定义,输出 Unknown ``` #### 7. **配置文件中的变量** - **全局配置**:如 `/etc/profile` 或用户级 `~/.profile`,这些文件在登录时加载[^3]。 - **脚本内生效**:若需跨脚本共享变量,需通过 `source` 命令加载配置文件: ```bash source ~/.profile # 使配置文件中变量在当前 Shell 生效 ``` --- ### 示例代码 ```bash #!/bin/bash # 声明变量 user="Bob" retries=3 # 调用变量 echo "User: $user, Retries left: ${retries}" # 修改布尔变量 failed=1 if [[ $failed -eq 1 ]]; then echo "Error occurred!" >&2 fi # 使用环境变量 export LOG_DIR="/var/log" echo "Logs saved to $LOG_DIR" ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值