Linux Bash脚本错误

Linux Bash脚本错误,linux,bash,shell,Linux,Bash,Shell,我正在尝试运行这些脚本,但不断收到错误消息: 一,- 错误消息是: stat:缺少操作数有关详细信息,请尝试“stat--help” 2- 错误消息是: stat:缺少操作数有关详细信息,请尝试“stat--help”/scr4: 第8行:[:-gt:应为一元运算符 知道如何修复它们吗?您需要在bash中引用变量,以防止出现分词问题,无论是在test方括号中还是在大多数情况下在其他用途中 所以你的第一个剧本是 #!/bin/bash filename="$1" if [ -f "$fi

我正在尝试运行这些脚本,但不断收到错误消息:

一,-

错误消息是:

stat:缺少操作数有关详细信息,请尝试“stat--help”


2-

错误消息是:

stat:缺少操作数有关详细信息,请尝试“stat--help”/scr4: 第8行:[:-gt:应为一元运算符



知道如何修复它们吗?

您需要在bash中引用变量,以防止出现分词问题,无论是在
test
方括号中还是在大多数情况下在其他用途中

所以你的第一个剧本是

#!/bin/bash

filename="$1"


if [ -f "$filename" ]
then
    owner="`stat -c %U "$filename"`"
    grep "$owner" /etc/passwd
    if [ $? -eq 0 ]; then
            perm="`stat -c %a "$filename" | head -c 1`"
            if [ "$perm" -gt 3 ]; then
                cat "$filename" | grep NOTE
            fi
    fi
fi

其他程序也有类似的错误

程序没有任何问题。您没有提供命令行参数。您必须以

1和3:

./script.sh <filename>
/script.sh
2:

/script.sh

$1
代表第一个命令行参数

两个技巧(不能解决您的问题)——不要使用反勾号'stat-c%U$filename',而是使用较新的
$()
符号
$(stat-c%U$filename)
消除嵌套问题——在vars上使用大括号
$dir
-->${dir<>代码>考虑<代码> a= $((和+num))<代码> vs>代码>让“A= $SUM +$NUM/代码> @ StPANPP好第一个建议,但不要认为第二个有任何好处,除非你特别喜欢语法或做一些类似于<代码>”${Value}字符串“< /Cord>好建议”,但要“看”“您的问题是,学习使用shell调试/跟踪选项、
set-vx(开)
、和
set+vx(关)
。这将打印要执行的代码,然后在前面加上
+
的第二行显示实际运行的命令,并用值替换变量名。虽然/Until/for循环和嵌套结构一开始可能会让人感到困惑,但请关注
+
'd行的结果。同时添加
导出PS4='${LINENO}+>
将向您显示当前正在执行的脚本的行号。祝您好运。@BroSlow@hedder-Good points,我经常使用[+|-]vx。我确实使用了
${var}字符串
,为了保持一致性,我现在总是使用
${var}
form,即使后面没有字符串。@user3357669如果它解决了问题,您应该接受这个答案,尽管如果您有权限,我仍然会更改脚本,因为它们在很多情况下都会失败。
#!/bin/bash

dir=$1

if [ -d $dir ]
    then
    perm=`stat -c %a $dir | head -c 1`
    if [ $perm -gt 5 ]; then
        cd $dir
        for file in $dir/*
        do
            if ! [ -x "$file" ]
            then
                echo "$file"
            fi
        done
    fi
fi
#!/bin/bash

filename="$1"


if [ -f "$filename" ]
then
    owner="`stat -c %U "$filename"`"
    grep "$owner" /etc/passwd
    if [ $? -eq 0 ]; then
            perm="`stat -c %a "$filename" | head -c 1`"
            if [ "$perm" -gt 3 ]; then
                cat "$filename" | grep NOTE
            fi
    fi
fi
./script.sh <filename>
./script.sh <number>