gpt4 book ai didi

linux - bash 脚本 : if condition

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:55:31 25 4
gpt4 key购买 nike

我正在将命令行参数传递给脚本,比如 a.sh。

在 a.sh 中,我使用“$@”将所有这些参数传递给另一个 bash 脚本 (user_pref.sh)。在这个 bash 文件中,我试图根据使用基本 if 条件从 a.sh 收到的参数分配 0 或 1。但出于某种原因,我无法推断出正确的值,并且我的所有变量都设置为 0。我是 bash 脚本的新手,非常感谢这里的任何帮助。我在网站上提到了不同的帖子,但到目前为止它们没有帮助我解决我的问题。

a.sh代码

#!/bin/bash

/home/postgres/viraltest_scripts/user_pref.sh "$@" &> /home/postgres/viraltest_scripts/logs/refresh_dev_sql.log

user_pref.sh代码:

#!/bin/bash
## assigning default values
a=1
b=1
c=1
if [[ $1 -eq 0 ]]
then
a=0
fi

if [[ $2 -eq 0 ]]
then
b=0
fi

if [[ $3 -eq 0 ]]
then
c=0
fi

无论我从 a.sh 传递什么,user_pref.sh 中的所有变量都被分配为 0。任何人都可以指出我在 If 语句中做错了什么吗?PS:我知道分配 a=$1 但出于我的应用程序的目的,我必须明确分配 0 或 1 而不是执行 a=$1。

最佳答案

编辑 您文件的第一行应该是#!/bin/bash,而不是#!/bin/sh。您正在使用 bash 扩展,因此请确保您要求脚本由 bash(而不是 sh、dash、csh 等)解释。

其次,-eq 测试numeric 相等性,而不是string 相等性。结果,[[ '' -eq 0 ]] 为真。我认为您可能需要 [[ $# -ge 1 && $1 = 0 ]] 以及类似的测试。 $# -ge 1 检查是否实际提供了参数,然后 = 测试字符串是否相等。像这样:

a=1
if [[ $# -ge 1 && $1 = 0 ]]; then a=0 ; fi
b=1
if [[ $# -ge 2 && $2 = 0 ]]; then b=0 ; fi
c=1
if [[ $# -ge 3 && $3 = 0 ]]; then c=0 ; fi

编辑 2 不确定这是否满足您的要求,但由于您只传递 01,您可以使用默认分配:

a="${1:-1}"
b="${2:-1}"
c="${3:-1}"

"${foo:-def}" 是具有默认值的替换。如果 $foo 未设置或为 null,则结果为 def;否则,$foo 就是结果。

测试

根据 OP 的评论:

$ cat a.sh
#!/bin/bash
./user_pref.sh "$@"

$ cat user_pref.sh
#!/bin/bash
set -x
a=1
if [[ $# -ge 1 && $1 = 0 ]]; then a=0 ; fi
b=1
if [[ $# -ge 2 && $2 = 0 ]]; then b=0 ; fi
c=1
if [[ $# -ge 3 && $3 = 0 ]]; then c=0 ; fi
echo a-"$a"- b-"$b"- c-"$c"

$ ./a.sh
+ a=1
+ [[ 0 -ge 1 ]]
+ b=1
+ [[ 0 -ge 2 ]]
+ c=1
+ [[ 0 -ge 3 ]]
+ echo a-1- b-1- c-1
a-1- b-1- c-1

手动给它 1 的情况(即使 1 是默认值):

$ ./a.sh 1
+ a=1
+ [[ 1 -ge 1 ]] <--- it saw the parameter
+ [[ 1 = 0 ]]
+ b=1
+ [[ 1 -ge 2 ]]
+ c=1
+ [[ 1 -ge 3 ]]
+ echo a-1- b-1- c-1
a-1- b-1- c-1

我认为 OP 指的是:

$ ./a.sh 0
+ a=1
+ [[ 1 -ge 1 ]] <--- it saw the parameter...
+ [[ 0 = 0 ]]
+ a=0 <--- ...and it overrode the default.
+ b=1
+ [[ 1 -ge 2 ]]
+ c=1
+ [[ 1 -ge 3 ]]
+ echo a-0- b-1- c-1
a-0- b-1- c-1

$ ./a.sh 0 0 0
+ a=1
+ [[ 3 -ge 1 ]]
+ [[ 0 = 0 ]]
+ a=0
+ b=1
+ [[ 3 -ge 2 ]]
+ [[ 0 = 0 ]]
+ b=0
+ c=1
+ [[ 3 -ge 3 ]]
+ [[ 0 = 0 ]]
+ c=0
+ echo a-0- b-0- c-0
a-0- b-0- c-0

关于linux - bash 脚本 : if condition,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46978494/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com