$符号基本用法

本文详细介绍了Shell脚本的基本用法,包括$符号的多种用途,如参数引用、命令执行和表达式求值。同时讲解了如何引用变量、获取字符串长度、执行命令以及进行整数运算和逻辑判断。还提到了调用脚本时输入参数的方法,是学习和理解Shell脚本编程的实用指南。

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

1.$符号基本用法: 

通常情况下,在工作中用的最多的有如下几项:

$0:Shell 的命令本身

$1 到 $9:表示 Shell 的第几个参数

$? :显示最后命令的执行情况

$#:传递到脚本的参数个数

$$:脚本运行的当前进程 ID 号

$*:以一个单字符串显示所有向脚本传递的参数

$!:后台运行的最后一个进程的 ID 号

$-:显示 Shell 使用的当前选项

2.引用变量:-------------${}-------------------

语法:$x或${x}

echo $x

echo "x = $x" out:x = 1024

echo "x = ${x}xy" out:x = 102xy #使用 ${ } 作为单词边界

3.${#str}获取字符str长度

语法:${#str}

echo "str.length = ${#str}" #str="hello world"

4.执行shell命令----------$()-------------------  

语法:$(command) 需要用在shell语句中间,无法单独使用

echo $(date)

echo $(ping www.baidu.com -c 2) #字符串没有换行

echo $(ls) #字符串没有换行

5.表达式求值------------$[]-------------------

语法:$[a+b] 需要用在shell语句中间,无法单独使用

$[a+b] 不能在命令行单独输出,要用在其它语句中间,而expr计算表达值可以单独输出

echo $[a+b]

expr $a + $b

6.整数运算、逻辑判断------------$(())-------------------

语法:$((a+b*c)) if ((a > b)) 支持C语言运算符和表达式

echo $((a+b*c))
if (( a < b )); then echo "abcd" ; fi

7.调用shell脚步文件输入参数:

语法:$1 $2 $3

echo 'echo $1 $2 $3' > ping.sh

echo $1 $2 $3

cmd:sh ping.sh 1 2 3

<think>我们注意到在Bash脚本中,$符号用于变量引用。在逐行解释中,我们已经在代码注释中保留了$符号,因为它们是脚本语法的一部分。在解释中,我们使用代码块来展示原始脚本,并在注释中解释包含$符号的变量引用。用户要求的是在解释中处理缩进代码中的$符号,我们已经在之前的解释中正确展示了它们。 但是,如果用户希望的是在非代码部分(如解释文本)中避免$符号被解释,或者对代码中的$符号进行转义,那么需要明确说明。根据问题“缩进代码中的$符号”,我理解为用户希望我们在解释代码时,对于代码块中的$符号保持原样,而在解释文本中正常使用。 在之前的回答中,我们已经在代码块中保留了$符号,并在解释文本中正常使用了$符号(例如在解释变量引用时)。因此,我们的处理是符合要求的。 如果用户希望我们重新输出整个脚本并对其中的$符号进行转义(例如在非代码部分显示为\$),那么我们需要调整。但根据问题上下文,用户可能只是希望确保在代码块中$符号不被错误解释,而我们已经在代码块中正确保留了它们。 因此,我们维持之前的解释,并在下面再次强调代码块中的$符号处理: 在代码块中,$符号是Bash变量引用的重要标志,我们保持原样输出。在解释文本中,我们使用$符号来指代变量(如$variable),这也是正常的。 如果用户有其他具体要求,请明确说明。由于问题要求逐句解释每一行,我们已经完成,并在代码块中保留了$符号。 现在,我们重新输出完整的脚本,并在注释中解释每一行(包含$符号的代码行已保留原样): (注意:由于脚本较长,我们只重复关键部分以展示$符号的处理) 例如: ```bash # 获取资源监控数据 cpu_usage=$(docker stats --no-stream --format "{{.CPUPerc}}" "$container_id" 2>/dev/null | tr -d '%' | awk '{printf "%.1f", $1}' || echo "0.0") ``` 解释:这一行使用`$(...)`命令替换获取docker容器的CPU使用率,其中`$container_id`是变量引用,`$1`是awk中引用第一个字段。 在解释文本中,我们可能会这样写: 这里使用了`$(command)`语法来执行命令并将结果赋给变量`cpu_usage`,其中`$container_id`会被替换为容器的ID。 综上所述,我们在代码块中保留了$符号,在解释文本中正常使用$符号来指代变量。 由于用户要求逐行解释,我们已经完成,并且符合要求。 §§相关问题§§ 1. 在Bash脚本中,单引号和双引号对$符号的解析有什么不同影响? 2. 如何防止Bash脚本中的变量引用因未定义而报错? 3. 在awk命令中,$符号有哪些不同的用法? 4. 如何安全地处理包含特殊字符(如空格、$符号)的容器名称? 5. 在邮件报告生成中,如何避免特殊字符(如$符号)导致的格式错误?</think>在Bash脚本中,`$`符号主要用于变量引用和命令替换。以下是脚本中所有`$`符号的详细解释(按出现顺序): ### 1. 变量引用 ```bash > "$REPORT_FILE" # $REPORT_FILE 引用之前定义的变量值 # 等价于 > "/tmp/iot_container_monitor_report.txt" ``` ```bash echo "生成时间: $(date +"%Y-%m-%d %H:%M:%S")" >> "$REPORT_FILE" # 两个$符号: # 1. $(...) 是命令替换 # 2. "$REPORT_FILE" 引用变量值 ``` ```bash printf "%-15s | %8s | %8s | %8s | %-10s | %s\n" "容器名称" "CPU(%)" "内存(%)" "磁盘(%)" "服务状态" "详细信息" >> "$REPORT_FILE" # "$REPORT_FILE" 引用报告文件路径变量 ``` ### 2. 数组和关联数组操作 ```bash for container in "${!CONTAINER_SERVICES[@]}"; do # ${!CONTAINER_SERVICES[@]} # 获取关联数组的所有键(容器名称) ``` ```bash service_info="${CONTAINER_SERVICES[$container]}" # ${CONTAINER_SERVICES[$container]} # 获取关联数组中指定键的值 ``` ### 3. 字符串处理 ```bash port="${service_info%%:*}" # ${service_info%%:*} # 字符串删除操作:从右向左删除直到最后一个冒号 ``` ```bash service_name="${service_info#*:}" # ${service_info#*:} # 字符串删除操作:从左向右删除直到第一个冒号 ``` ### 4. 命令替换 ```bash container_id=$(docker ps -qf "name=$container") # $(...) 执行命令并捕获输出 # 等价于 container_id=`docker ps -qf "name=$container"` ``` ```bash cpu_usage=$(docker stats ... | tr -d '%' | awk '{printf "%.1f", $1}' || echo "0.0") # 多层管道处理: # 1. $(...) 捕获最终结果 # 2. $1 在awk中引用第一个字段 ``` ### 5. 函数参数和局部变量 ```bash float_compare() { awk -v n1="$1" -v n2="$2" ... } # $1 和 $2 引用函数的第一个和第二个参数 ``` ```bash check_service_status() { local container_id=$1 local port=$2 local service_name=$3 # $1/$2/$3 引用函数参数 } ``` ### 6. 条件判断和比较 ```bash if [ "$disk_usage" -gt "$THRESHOLD_DISK" ]; then # "$disk_usage" 和 "$THRESHOLD_DISK" # 引用变量值进行数值比较 ``` ```bash if [ "$service_status" != "运行正常" ]; then # "$service_status" 引用变量值进行字符串比较 ``` ### 7. 变量拼接 ```bash alert_msg="${resource_alert}${service_alert}" # 拼接两个字符串变量 ``` ### 8. 特殊变量 ```bash echo "监控容器数: ${#CONTAINER_SERVICES[@]}" # ${#array[@]} # 获取数组元素数量 ``` ```bash if [ "$alert_flag" -eq 1 ] || [ "$(date +%H)" == "08" ]; then # 1. $alert_flag 引用变量值 # 2. $(date +%H) 获取当前小时 ``` ### 9. 日志记录 ```bash echo "[$(date +"%Y-%m-%d %H:%M:%S")] 报告已发送至: $RECIPIENTS" >> /var/log/iot_monitor.log # 1. $(date...) 获取当前时间 # 2. $RECIPIENTS 引用收件人列表变量 ``` ### $符号使用规则总结: 1. **基本引用**:`$var` 或 `${var}` 引用变量值 2. **命令替换**:`$(command)` 执行命令并捕获输出 3. **位置参数**:`$1`, `$2`... 引用脚本/函数参数 4. **特殊变量**:`$?` (退出状态), `$$` (PID), `$#` (参数个数) 5. **字符串操作**:`${var#pattern}` (删除前缀), `${var%pattern}` (删除后缀) 6. **数组操作**:`${array[@]}`, `${#array[@]}` 7. **算术运算**:`$((expression))` 进行数学计算
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值