bash while 循环用单引号刺激

bash while 循环用单引号刺激

我有几行代码。我只想检查参数是否$1在带有循环的文件中while,所以我编写了这段代码。

#!/bin/bash
if [ ! -z $1 ]
then
    update=$1;
    while read line
    do
        if [ $update == $line ]
        then
            echo "yes";
        fi
    done<./available_updates
fi

但在调试中如果我运行

[root@pc bagheri]# bash -x ./test.sh my_value

它说:

+ '[' my_value == 'my_value' ']'

并跳过该条件只是因为这两个单引号而不是打印“是”字,但我 100% 确定该my_value文件存在于available_updates文件中。我应该为此做什么?

答案1

不要使用 shell 循环来处理文本

#! /bin/sh -
update="${1?missing update argument}"
grep -Fxqe "$update" < available_updates && echo yes

您的代码中的一些问题:

  • 参数扩展必须在类似 Bourne 的 shell 中引用。
  • 读取一行的语法是readis IFS= read -r line, not read line
  • 检查脚本是否至少给出一个参数 if 的语法[ "$#" -gt 0 ](尽管另请参阅该${1?error message}方法)。[ ! -z "$1" ](这里添加缺少的引号)仅检查第一个是否非空。

'xtrace输出中看到的内容不是传递给命令的数据的一部分[,它们在那里输出以确保显示的内容构成有效的 shell 代码。这表明$line不仅仅包含my_value那里,还可能包含其他一些bash认为需要引用的隐形字符。它可能类似于 U+FEFF,即“字节顺序标记”字符。

跑步LC_ALL=C sed -n l < available-updates可以帮助揭示那些看不见的人物。

相关内容