在Unix中输入错误/无效输入时,如何设置默认值?

时间:2013-10-31 03:35:53

标签: unix

我想将 inputLineNumber 的值设置为20.我尝试通过 [[ - z“$ inputLineNumber”]] 检查用户是否没有给出值然后通过 inputLineNumber = 20 设置值。代码在控制台上显示此消息 ./ t.sh:[ - z:not found 作为消息。怎么解决这个?这是我的完整脚本。

#!/bin/sh
cat /dev/null>copy.txt
echo "Please enter the sentence you want to search:"
read "inputVar"
echo "Please enter the name of the file in which you want to search:"
read "inputFileName"
echo "Please enter the number of lines you want to copy:"
read "inputLineNumber"
[[-z "$inputLineNumber"]] || inputLineNumber=20
for N in `grep -n $inputVar $inputFileName | cut -d ":" -f1`
do
  LIMIT=`expr $N + $inputLineNumber`
  sed -n $N,${LIMIT}p $inputFileName >> copy.txt
  echo "-----------------------" >> copy.txt
done
cat copy.txt

在@Kevin提出建议后更改了脚本。现在错误消息 ./ t.sh:第11行的语法错误:'$'意外

#!/bin/sh
truncate copy.txt
echo "Please enter the sentence you want to search:"
read inputVar
echo "Please enter the name of the file in which you want to search:"
read inputFileName
echo Please enter the number of lines you want to copy:
read inputLineNumber
[ -z "$inputLineNumber" ] || inputLineNumber=20

for N in $(grep -n $inputVar $inputFileName | cut -d ":" -f1)
do
  LIMIT=$((N+inputLineNumber))
  sed -n $N,${LIMIT}p $inputFileName >> copy.txt
  echo "-----------------------" >> copy.txt
done
cat copy.txt

2 个答案:

答案 0 :(得分:0)

尝试从以下位置更改此行:

[[-z "$inputLineNumber"]] || inputLineNumber=20

对此:

if [[ -z "$inputLineNumber" ]]; then
   inputLineNumber=20
fi

希望这有帮助。

答案 1 :(得分:0)

从哪里开始...

您的投放时间为/bin/sh但尝试使用[[[[sh无法识别的bash命令。将shebang更改为/bin/bash(首选)或使用[代替。

[[-z之间没有空格。这导致bash将其作为名为[[-z的命令读取,这显然不存在。你需要[[ -z $inputLineNumber ]](注意最后的空格)。 [[内的引文无关紧要,但如果您更改为[(请参见上文),则需要保留引号。

您的代码显示为[[-z,但您的错误显示为[-z。选一个。

使用$(...)代替`...`。不推荐使用反引号,$()可以正确处理引号。

你不需要cat /dev/null >copy.txt,当然不需要两次,而不是两次。使用truncate copy.txt或仅使用>copy.txt

你似乎有不一致的引用。引用或转义(\x)任何带有特殊字符(~, `, !, #, $, &, *, ^, (), [], \, <, >, ?, ', ", ;)或空格的内容以及任何可能包含空格的变量。您不需要引用没有特殊字符的字符串文字(例如":")。

而不是LIMIT=`expr...`,请使用limit=$((N+inputLineNumber))