我有几行代码。我只想检查参数是否$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
#! /bin/sh -
update="${1?missing update argument}"
grep -Fxqe "$update" < available_updates && echo yes
您的代码中的一些问题:
- 参数扩展必须在类似 Bourne 的 shell 中引用。
- 读取一行的语法是
read
isIFS= read -r line
, notread 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
可以帮助揭示那些看不见的人物。