shell 读取一个字符

应用环境linux sh

在嵌入式linux中读取一个字符,开始想用read来实现的,但是发现read输入需要回车才能结束,查了下read用法,

read: 用法: read [-ers] [-a 数组] [-d 分隔符] [-i 缓冲区文字] [-n 读取字符数] [-N 读取字符数] [-p 提示符] [-t 超时] [-u 文件描述符] [名称 ...]

,read -n可以解决,但是问题来,read加了参数貌似不支持sh终端,只能在bash中使用,只能换其他的方法了,方法如下


test.sh


#!/bin/sh

echo "Press 'y' or 'Y' to enter test mode:"

getchar()
{
    k=`stty -g` #获取当前stty设置
    stty -echo #禁用echo
    stty raw
    stty min 0 time 1 #设置超时时间为1/10秒
    dd if=/dev/tty bs=1 count=1 2>/dev/null  #读取一个字符
    stty -raw
    stty echo
    stty $k
}
 

Ecounter=0
date #测试开始时间
while [ 1 ]; do
    if [ $Ecounter -ge 30 ]; then break; fi
    Ecounter=`expr $Ecounter + 1`;
    char=`getchar`
    if [ "$char" = 'y' ] || [ "$char" = 'Y' ] ; then
        echo "char=$char"
        break;
    fi
done
date #测试结束时间

测试结果

./test.sh
Press 'y' or 'Y' to enter test mode:
2016年 09月 18日 星期日 11:26:08 CST
2016年 09月 18日 星期日 11:26:11 CST
lqj@lqj:~/socket$ ./test.sh
Press 'y' or 'Y' to enter test mode:
2016年 09月 18日 星期日 11:26:13 CST
ychar=y
2016年 09月 18日 星期日 11:26:13 CST

<think>好的,用户现在想了解如何在Shell脚本中读取一个字符串并进行比较,判断它们是否相同。之前他们问过整数比较的问题,现在转向字符串比较,可能需要处理用户输入或文件内容。我需要先回顾Shell字符串比较的基本方法,确保涵盖不同的语法结构,比如test命令、双括号和双方括号。 首先,用户可能不熟悉字符串比较的操作符,比如等于、不等于,以及如何处理空格和特殊字符。需要强调引号的重要性,避免变量未定义或包含空格导致的问题。比如,如果变量未用引号包裹,空变量会导致语法错误,比如[ $var == "abc" ],如果var为空,就会变成[ == "abc" ],这显然会报错。 然后,考虑用户可能的错误,比如使用整数比较的操作符(-eq)来比较字符串,或者忘记转义特殊字符。需要指出常见错误和解决方法,比如使用双引号包裹变量,使用正确的字符串操作符(==或!=),以及使用双方括号[[ ]]来避免路径扩展和单词分割的问题。 另外,用户可能需要处理大小写敏感的问题,或者检查字符串是否为空。这部分可以补充在高级用法里,比如转换大小写后再比较,或者使用-z和-n测试空字符串。 还需要提供一些实际例子,比如读取用户输入并比较,或者比较两个变量的值。例子要简单明了,展示正确的语法结构,并解释每一步的作用。比如使用read命令获取输入,然后用不同的方法进行比较。 最后,要总结最佳实践,比如总是引用变量,优先使用双方括号,处理大小写问题的方法等。确保用户理解不同方法的适用场景,比如兼容性考虑,如果脚本需要在不同的Shell环境中运行,可能需要使用更传统的test命令而不是双方括号。</think>在 Shell 脚本中,字符串比较需要特别注意 **语法格式** 和 **引号使用**,否则可能引发逻辑错误或意外结果。以下是核心知识点和详细示例: --- ### 一、字符串比较的 3 种语法 #### 1. **`test` 或 `[ ]` 命令** - **必须使用字符串专用操作符**: ```bash [ "$str1" = "$str2" ] # 判断相等(注意等号两边有空格) [ "$str1" != "$str2" ] # 判断不等 ``` - **典型错误**: ```bash [ $str1 == $str2 ] # ❌ 未加引号,变量含空格或空值时会报错 [ $str1 = "hello" ] # ❌ 若 $str1 未定义,会变成 [ = "hello" ] ``` #### 2. **双方括号 `[[ ]]`(Bash 扩展语法)** - 支持更灵活的语法,自动处理空值和空格: ```bash [[ $str1 == "$str2" ]] # ✅ 可直接用变量(仍建议加引号) [[ $str1 == "abc*" ]] # ✅ 支持通配符匹配(如匹配 "abc123") ``` #### 3. **直接使用变量** - 仅适用于简单场景(不推荐): ```bash if [ "$str1" ] && [ "$str1" = "$str2" ]; then echo "非空且相等" fi ``` --- ### 二、关键注意事项 #### 1. **引号必须包裹变量** - ❌ 错误写法:`[ $str1 = $str2 ]` - 若变量含空格(如 `str1="hello world"`),会解析为 `[ hello world = ... ]`(语法错误) - ✅ 正确写法:`[ "$str1" = "$str2" ]` #### 2. **空字符串处理** - 判断字符串是否为空: ```bash [ -z "$str" ] # 字符串为空时成立(zero length) [ -n "$str" ] # 字符串非空时成立(non-zero) ``` #### 3. **大小写敏感问题** - 若需忽略大小写,可转换字符串再比较: ```bash [[ "${str1,,}" = "${str2,,}" ]] # 转全小写(Bash 4.0+) [[ "${str1^^}" = "${str2^^}" ]] # 转全大写(Bash 4.0+) ``` --- ### 三、完整示例 #### 示例 1:直接比较两个变量 ```bash str1="Hello" str2="World" if [ "$str1" = "$str2" ]; then echo "字符串相等" else echo "字符串不等" # 输出此结果 fi ``` #### 示例 2:读取用户输入并比较 ```bash #!/bin/bash read -p "输入第一个字符串: " input1 read -p "输入第二个字符串: " input2 if [[ "$input1" == "$input2" ]]; then echo "输入内容相同" else echo "输入内容不同" fi ``` #### 示例 3:带通配符的模式匹配 ```bash file="image.jpg" if [[ "$file" == *.jpg ]]; then echo "这是一个JPEG文件" # 输出此结果 fi ``` --- ### 四、最佳实践 1. **优先使用 `[[ ]]`** 更安全(自动处理空值和特殊字符),支持通配符和正则表达式(需用 `=~` 操作符)。 2. **始终包裹变量** 即使变量看似简单,也要用 `"$var"` 格式,避免意外空格或空值。 3. **明确处理大小写** 如需忽略大小写,提前转换字符串格式。 4. **防御性检查** 在比较前验证变量是否已定义: ```bash if [ -z "${str1:-}" ]; then echo "错误:str1 未定义" exit 1 fi ``` --- 通过正确使用引号、操作符和语法结构,可确保 Shell 脚本的字符串比较行为符合预期。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值