为什么我在bash字符串相等性测试中遇到意外的操作符错误?

Joh*_*all 11 bash

第四行的错误在哪里?

if [ $bn == README ]; then
Run Code Online (Sandbox Code Playgroud)

如果我把它写成,我仍然会得到

if [ $bn == README ]
then
Run Code Online (Sandbox Code Playgroud)

要么

if [ "$bn" == "README" ]; then
Run Code Online (Sandbox Code Playgroud)

语境:

for fi in  /etc/uwsgi/apps-available/* 
do 
        bn=`basename $fi .ini`
        if [ $bn == "README" ]
        then
                echo "~ ***#*** ~"
        else
                echo "## Shortend for convience ##"
        fi
done
Run Code Online (Sandbox Code Playgroud)

kon*_*box 13

您不能使用==进行单括号比较([]).使用single =代替.您还必须引用变量以防止扩展.

if [ "$bn" = README ]; then
Run Code Online (Sandbox Code Playgroud)

如果你使用[[]],那可能适用,你不需要引用第一个参数:

if [[ $bn == README ]]; then
Run Code Online (Sandbox Code Playgroud)

  • @ user000001在_bash_上,是的,`==`有效,但它是一个扩展 - POSIX标准不需要它工作,所以你编写的代码不能移植,没有任何理由. (2认同)

Chr*_*lan 7

将以下内容添加到脚本顶部:

#! /bin/bash
Run Code Online (Sandbox Code Playgroud)

在 bash 中,与在单括号内使用时== 相同。=然而,这是不可移植的。#! /bin/bash因此,您应该通过将 放在脚本的顶部来明确告诉 shell 使用 bash 作为脚本的解释器。

或者,使用 进行字符串比较=。请注意,该==运算符在双括号内使用时的行为与在单括号内使用时的行为不同(请参阅链接)。