0

我想将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
4

2 回答 2

0

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

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

对此:

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

希望这可以帮助。

于 2013-10-31T03:51:17.650 回答
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)).

于 2013-10-31T03:53:10.417 回答