shell中变量

本文深入讲解Shell脚本的基础知识,包括脚本调用方式、变量定义与分类、环境变量设置、字符转译、变量声明与传递等核心内容,以及如何通过read命令实现变量交互和利用命令结果设定变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、脚本
1、脚本调用方式:
ps -f						 查看进程的依赖关系
sh script.sh				 重新开启一个shell,进行脚本调用,使用重新开启的环境解析
./script.sh==/mnt/script.sh  在当前shell中执行,使用文件中指定的环境解析
source script.sh==. script.sh在当前shell中执行,使用当前环境解析
2、清空日志脚本
#!/bin/bash
line=`sed -n '$=' /etc/rsyslog.conf`
log_file=`grep RULES -A $line /etc/rsyslog.conf | awk -F " " '!/^#/&&!/^$/{print $2}' | sed -e 	's/-//g' -e '/^:/d'`
for i in $log_file
do
    	>$i
    	echo $i is cleaned!!!
done
二、变量:

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

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

1、变量分类
export A = 1 					只在当前shell中生效 
~/.bash_profile					普通用户自己的环境变量						
/etc/skel/.bash_profile			超级用户环境变量
/etc/profile					系统环境变量
	evn							查看环境变量
PS1								特殊变量,控制命令行最前边的字符
2、字符的转译及变量的声明
 \ 转译单个字符 
 "" 弱引用,批量转译 "" 中出现的字符
 '' 强引用,批量转译 '' 中出现的字符
 '' 与 "" 两者的区别在于, "" 不能转译 "\","`","!","$" 
 ${} 变量声明 例如:
 			  A=1 echo $Ab 
 			  	  echo ${A}b
 			  a = (1 2 3 4 5)
 			  	  echo ${a[0]}
			  	  echo ${a[*]}
3、变量值传递
$0 脚本本身
$1 脚本后的第一串字符串 
$2 脚本后的第二串字符串 
$3 脚本后的第三串字符串 
$# 脚本后所跟字符串的个数
$* 脚本后跟的所有字符串,模式为“ 1 2 3  “
$@ 脚本后跟的所有字符串,模式为“ 1”“2”“3” 
$$ 脚本执行的PID

实例($*和$@的区别)
$*
在这里插入图片描述
在这里插入图片描述
$@
在这里插入图片描述
在这里插入图片描述

4、read实现变量传递
#!/bin/bash
read -p "please input  ipaddress:" -s IPADDRESS 	-s隐藏输入
echo .....
ping -c1 -w1 $IPADDRESS &> /dev/null && {
	echo $IPADDRESS is up!
} || {
	echo $IPADDRESS ip down!	
}
5、利用命令执行结果设定变量
Hostname=$(hostname) 
Hostname=`hostname` 
$? 是命令在执行完成之后产生的退出值 范围是 [0-255] 
当 $0=0 时标示命令执行没有错误输出 这个值可以用 exit 命令执行 
例如 exit 66 
6、系统中命令别名的设定
alias xie='vim' 				环境级别名设定
vim ~/.bashrc					用户级别名设定
	alias xie='vim' 
vim  /etc/bashrc				系统级别别名设定 
	alias xie='vim' 
unalias xie						删除别名,配置文件中的内容也要删除
<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、付费专栏及课程。

余额充值