Shell——之expr判断字符串与整数

本文介绍了一个简单的bash脚本,该脚本能够接收用户输入并判断其是否为整数类型。通过使用expr命令进行算术运算尝试,如果输入可以成功进行加法操作则认定为整数。

说明:此脚本用于判断用户所输入的变量是否为整数


#!/bin/bash
while true
do
    read -p "Pls input:" a
    expr $a + 0 >/dev/null 2>&1
    [ $? -eq 0 ] && echo int || echo chars
done

测试结果:

 

<think>我们正在讨论的是Linux shell脚本中的`expr index`命令用法。该命令用于在字符串中查找子字符串中任意字符首次出现的位置。 基本语法:`expr index STRING CHARS` 功能:在STRING中查找CHARS中的任意字符,返回第一个匹配的字符在STRING中的位置(从1开始计数)。如果CHARS中没有任何字符出现在STRING中,则返回0。 注意:CHARS是一个字符集合,只要STRING中的字符出现在这个集合中,就匹配。 示例: 假设我们有一个字符串STRING="hello world",我们想查找其中任意一个字符在集合"aeiou"(元音字母)中首次出现的位置。 执行:`expr index "hello world" "aeiou"` 结果:2(因为第一个元音字母是'e',出现在第2个位置) 另一个示例:查找"world"中任意字符在"hello"中首次出现的位置。 执行:`expr index "world" "hello"` 结果:2(因为'world'中的字符'o'出现在"hello"中,且'o'在"world"中是第2个字符?注意:这里要澄清一下,实际上是在"world"中查找'h','e','l','o'这几个字符,第一个出现的是哪个?实际上,在"world"中,第一个出现的匹配字符是'l'(在"hello"中存在),但注意:'l'在"world"中是第3个字符?不对,我们来看: 字符串"world":w(1), o(2), r(3), l(4), d(5) 但是,我们查找的是在"world"中任意一个字符,只要它出现在"hello"中,就返回它在"world"中的位置。所以: - 'w'不在"hello"中? - 'o'在"hello"中,所以返回位置2。 因此,第二个示例的结果应该是2(因为'o'在"world"的第2个位置,并且它是第一个匹配的字符)。 但是注意:`expr index`命令是扫描STRING,然后检查STRING中的每个字符是否在CHARS中出现,一旦出现就返回该字符在STRING中的位置。所以它并不是在CHARS中查找子字符串,而是查找字符集合中的任意字符。 重要:返回的位置是STRING中第一个匹配字符的位置,而不是CHARS中字符的位置。 另外,如果CHARS中有重复字符,不影响结果,因为只关心字符是否在集合中。 例如:`expr index "abc" "cba"` 会返回1,因为第一个字符'a'在集合"cba"中。 使用场景:通常用于查找字符串中某个字符集合中的字符首次出现的位置。 现在,我们根据用户要求,提供关于`expr index`命令的用法,用于查找字符串匹配。 注意:用户要求的是“查找字符串匹配”,但这里要明确,`expr index`不是用来匹配子字符串,而是匹配字符集合中的任意单个字符。 因此,如果用户需要查找一个子字符串(而不是字符集合)首次出现的位置,应该使用`expr index`吗?不,`expr index`不适合子字符串匹配,它只适合字符集合匹配。对于子字符串匹配,可以使用`expr match`或`expr substr`?实际上,`expr`命令中用于子字符串匹配的是`expr substr`吗?不,`expr substr`是提取子字符串,而查找子字符串位置可以使用`expr index`吗?不能,因为`expr index`是查找字符集合。 在`expr`命令中,并没有直接提供查找子字符串位置的功能。我们可以使用`expr match`来匹配一个正则表达式,但是返回的是匹配的长度,而不是位置。或者我们可以使用其他工具如`awk`或`grep`。 但是,用户明确要求使用`expr index`命令,所以我们只讨论它的字符集合匹配功能。 因此,我们总结如下: 命令:`expr index STRING CHARS` 功能:返回STRING中第一个出现在CHARS集合中的字符的位置(从1开始计数)。如果没有找到,返回0。 示例: 1. 查找字符串"hello"中元音字母首次出现的位置: $ expr index "hello" "aeiou" 2 # 因为'e'在第二个位置 2. 查找字符串"12345"中数字"42"首次出现的位置(实际上是查找字符'4'或'2'): $ expr index "12345" "42" 2 # 因为'2'在第二个位置(注意,虽然'4'在集合中,但是'2'先出现) 3. 如果查找的字符都不在字符串中: $ expr index "hello" "xyz" 0 4. 注意:如果CHARS中包含特殊字符(如`*`、`[`等),需要用引号括起来,避免被shell解释。 5. 在脚本中使用: #!/bin/bash str="example string" chars="aeiou" pos=$(expr index "$str" "$chars") echo "The first vowel is at position: $pos" 注意:如果字符串或字符集合中包含空格,必须用引号括起来。 另外,由于`expr`命令是外部命令,在脚本中频繁调用可能会影响性能,如果对性能要求高,可以考虑使用shell内置的字符串操作(如bash的`[[ str =~ regex ]]`)或其他工具。但是`expr index`在简单的脚本中仍然有用。 相关问题: 1. 如果我想查找一个子字符串(而不是字符集合)在字符串中的位置,应该用什么命令? 2. `expr index`命令在遇到空格时如何处理? 3. 在bash脚本中,有没有内置的方法可以实现`expr index`相同的功能? 4. 如何用`expr index`查找字符串中最后一个匹配字符的位置? 5. `expr index`命令返回的位置是从0开始还是从1开始? 现在,我们根据上述内容,回答用户的问题。</think>### Linux Shell 脚本中 `expr index` 命令用法详解 `expr index` 用于在字符串中查找**字符集合**首次出现的位置(返回位置从 1 开始计数)。其核心功能是扫描字符串,返回字符集合中**任意一个字符**首次出现的位置索引。 #### 📌 基本语法 ```bash expr index "源字符串" "字符集合" ``` - **源字符串**:被搜索的目标字符串 - **字符集合**:要查找的字符组合(任意字符匹配即触发) - **返回值**:匹配字符的位置(1 起始),无匹配时返回 `0` #### 🔍 关键特性 1. **字符级匹配** 在字符集合中任意字符匹配即成功(非子字符串匹配) 2. **首次出现原则** 返回第一个匹配字符的位置 3. **位置计数** 结果从 1 开始(数组索引不同) 4. **空格敏感** 字符串和集合中的空格均参匹配 #### 🧪 示例演示 ```bash # 示例 1:查找元音首次出现位置 expr index "Linux shell" "aeiou" # 输出 2 (i 在位置 2) # 示例 2:查找数字首次出现位置 expr index "Error: 404 Not Found" "0123456789" # 输出 8 (4 在位置 8) # 示例 3:无匹配返回 0 expr index "Hello World" "xyz" # 输出 0 # 示例 4:空格参匹配 expr index "file.txt" " ." # 输出 5 (点号在位置 5) ``` #### ⚠️ 注意事项 1. **非子串匹配** 若需查找完整子串(如 "txt"),应使用 `expr match` 或 `grep`: ```bash expr match "file.txt" '.*\(txt\)' # 返回子串 "txt" ``` 2. **特殊字符转义** 遇到 `*`、`[` 等符号时需转义: ```bash expr index "a*b" "*" # 错误 expr index "a*b" "\*" # 正确 → 输出 2 ``` 3. **脚本应用** 在脚本中捕获结果: ```bash #!/bin/bash str="config.ini" pos=$(expr index "$str" "._-") echo "分隔符位置: $pos" # 输出 7 (点号位置) ``` #### 💡 典型应用场景 - 定位文件名中的扩展分隔符(如 `.`) - 检查字符串中是否包含特定字符类(如数字、符号) - 解析简单格式数据(如查找分隔符位置) --- ### 📚 相关问题 1. **`expr index` `grep -o` 在字符查找中有何本质区别?** 2. **如何用 Shell 内置方法替代 `expr index` 实现相同功能?** 3. **若需查找字符串中 *最后* 一个匹配字符的位置,应如何修改命令?** 4. **`expr index` 在处理 Unicode 字符时有哪些限制?** 5. **如何组合 `expr index` 和 `cut` 命令实现基于字符位置的字段提取?** > 引用说明: > 关于 Shell 字符串操作的基础概念可参考 POSIX 标准文档 [^1],特殊字符处理规则详见 Bash 手册 [^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值