我想将 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
答案 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))
。