Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell unix一元运算符错误_Shell_Unix_Scripting - Fatal编程技术网

Shell unix一元运算符错误

Shell unix一元运算符错误,shell,unix,scripting,Shell,Unix,Scripting,我试图在输入文件路径中找到一个字符串,如果匹配,则将其替换为其他文件路径 下面是代码 * * echo语句正确地将值显示为某个数字,但在if语句中,我得到了一元运算符错误 有人能帮我纠正一下我缺少的地方吗看来您还没有定义b变量,所以当您编写 if [ $idx -gt $b ] shell在展开变量后看到了这一点 if [ 12 -gt ] 使用以下表格之一: if [ "$idx" -gt "$b" ] # use quotes to maintain the operators

我试图在输入文件路径中找到一个字符串,如果匹配,则将其替换为其他文件路径

下面是代码

*

*

echo语句正确地将值显示为某个数字,但在if语句中,我得到了一元运算符错误


有人能帮我纠正一下我缺少的地方吗

看来您还没有定义
b
变量,所以当您编写

if [ $idx -gt $b ]
shell在展开变量后看到了这一点

if [ 12 -gt  ]
使用以下表格之一:

if [ "$idx" -gt "$b" ]    # use quotes to maintain the operators as words
if [[ $idx -gt $b ]]      # the [[ form does not require quoting
if ((idx > b))            # use arithmetic expression
如果
b
未设置,第一个表单仍将抛出错误:

$ declare -i idx=12 b
$ [ "$idx" -gt "$b" ] && echo yes
bash: [: : integer expression expected
$ [[ $idx -gt $b ]] && echo yes
yes
$ ((idx > b)) && echo yes
yes

似乎您尚未定义
b
变量,因此在编写

if [ $idx -gt $b ]
shell在展开变量后看到了这一点

if [ 12 -gt  ]
使用以下表格之一:

if [ "$idx" -gt "$b" ]    # use quotes to maintain the operators as words
if [[ $idx -gt $b ]]      # the [[ form does not require quoting
if ((idx > b))            # use arithmetic expression
如果
b
未设置,第一个表单仍将抛出错误:

$ declare -i idx=12 b
$ [ "$idx" -gt "$b" ] && echo yes
bash: [: : integer expression expected
$ [[ $idx -gt $b ]] && echo yes
yes
$ ((idx > b)) && echo yes
yes

感谢所有回答我问题的人…问题在于index命令,而不是将其保留在括号中。[[]]的语法正常工作,但出现了“缺少整数表达式”的新错误。下面是最后运行的代码

    fnd='WIP'
b=0
a=10
repl='Archive'
rep2=$(echo $FilePath | grep -c 'Forecast')

if [[ $rep2 -gt $b ]]
then
   arch_dir=${FilePath/$fnd/$repl}
  # echo $arch_dir
   dir=$FilePath
extn='.csv'
for file in "$dir"*FORECAST*.csv
do
  echo "$file"
  if [[ "$file" > $dir/null ]]; then
    fn=$(echo "$file"|cut -d "." -f1|rev|cut -d"/" -f1|rev)
  mv "$file" $arch_dir"$fn"_$dt$extn
  else
  echo "There are no FORECAST files in directory "$dir
fi
done
fi

感谢所有回答我问题的人…问题在于index命令,而不是将其保留在括号中。[[]]的语法正常工作,但出现了“缺少整数表达式”的新错误。下面是最后运行的代码

    fnd='WIP'
b=0
a=10
repl='Archive'
rep2=$(echo $FilePath | grep -c 'Forecast')

if [[ $rep2 -gt $b ]]
then
   arch_dir=${FilePath/$fnd/$repl}
  # echo $arch_dir
   dir=$FilePath
extn='.csv'
for file in "$dir"*FORECAST*.csv
do
  echo "$file"
  if [[ "$file" > $dir/null ]]; then
    fn=$(echo "$file"|cut -d "." -f1|rev|cut -d"/" -f1|rev)
  mv "$file" $arch_dir"$fn"_$dt$extn
  else
  echo "There are no FORECAST files in directory "$dir
fi
done
fi


idx=expr index$FilePath'Forecast'
应该是什么?@muru,可能是backtick的格式问题。您没有为b分配任何内容。如果使用双引号
if[“$idx”-gt“$b”]
@Muru,
idx=expr index$FilePath'Forecast'
是检查变量$FilePath中是否存在字符串“Forecast”的表达式,则会得到一条稍好的错误消息。这里有点不对劲。我猜…正常的if语句正在工作,但是if表达式中的idx给出了一元运算符什么是
idx=expr index$FilePath'Forecast'
应该是?@muru,可能是backtick的格式问题您没有给b赋值。如果使用双引号
if[“$idx”-gt“$b”]
@Muru,
idx=expr index$FilePath'Forecast'
是检查变量$FilePath中是否存在字符串“Forecast”的表达式,则会得到一条稍好的错误消息。这里有点不对劲。我猜…正常的if语句正在工作,但是if表达式中的idx给出了一元运算符。注意,
[[[[$idx>$b]]
也是有效的,而且(依我看)总是喜欢旧的
测试的一个重要原因。这里根本不是讨论这个问题的好地方,也许我是在咆哮,但最近我看到很多代码都在使用这种结构,我的直觉是发生了重定向,这总是受到语法的干扰。除了词法比较,所以“2”>“12”啊!避免
[[
!我永远不会理解支持实现类似语法的参数,以避免一些小错误,并使过程中的每个人都感到困惑!嗨,Glenn,谢谢你的回答。这里我的目的是在filepath变量中找到“Forecast”一词。如果该词存在,我将执行replace string。nit:b已声明,但不是initi同样,请注意,
[[$idx>$b]]
也是有效的,并且(IMO)总是倾向于使用较旧的
测试的一个重要原因。这里根本不适合讨论,也许我是在咆哮,但最近我看到很多代码使用这种结构,我的直觉是,有重定向发生,这总是受到语法的干扰。除了词法比较,所以“2”>“12”啊!还有更好的理由避免
[[
!我永远不会理解支持实现类似语法的参数,以避免一些小陷阱,并在过程中混淆每个人!嗨,Glenn,谢谢你的回答。这里我的目的是在filepath变量中找到“Forecast”一词。如果该词存在,我将替换字符串。