我很困惑,但仍然猜想我以某种方式误解了 Bash。
/$ if [ -e /bin/grep ]; then echo yea; else echo nay ; fi
yea
/$ if [ ! -e /bin/grep ]; then echo yea; else echo nay ; fi
nay
/$ if [ -a /bin/grep ]; then echo yea; else echo nay ; fi
yea
/$ if [ ! -a /bin/grep ]; then echo yea; else echo nay ; fi
yea
Run Code Online (Sandbox Code Playgroud)
为什么否定!会逆转测试的效果-e而不是-a测试?
男人巴什 说:
3 个参数
以下条件按列出的顺序应用。
- 如果第二个参数是上面条件表达式下列出的二进制条件运算符之一,则表达式的结果是使用第一个和第三个参数作为操作数的二进制测试的结果。当存在三个参数时,
-a …
我在回答另一个问题时注意到test和[是不同的二进制文件,但[联机帮助页会显示test's. 除了对结局的要求],还有什么区别吗?如果不是,为什么它们分开二进制文件而不是符号链接?(它们也是bash内置bash函数,也没有区别。)
我正在检查我的主题的更新脚本
我有 2 个文本文件。第一个称为“current.txt”并包含当前版本。4.1.1该文本文件中有字符串。
第二个称为“latest.txt”并包含最新版本。4.2此文本文件中有字符串。
所以这是代码
echo "Checking update";
x=$(cat ./current.txt)
y=$(cat ./latest.txt)
if [ "$x" -eq "$y" ]
then
echo There is version $y update
else
echo Version $x is the latest version
fi
Run Code Online (Sandbox Code Playgroud)
这意味着如果 current.txt 与 latest.txt 不同,那么它会说“有 4.2 版更新”。如果不是,它会说“版本 4.1.1 是最新版本”
但是当我尝试运行它时。我收到这个错误
Checking update
./test.sh: line 4: [: 4.1.1: integer expression expected
Version 4.1.1 is the latest version
Run Code Online (Sandbox Code Playgroud)
那么我做错了什么?
zsh当我bash在 Windows 上启动时,我刚刚找到了一种启动方式
https://www.howtogeek.com/258518/how-to-use-zsh-or-another-shell-in-windows-10/。
建议在.bashrc.
# Launch Zsh
if [ -t 1 ]; then
exec zsh
fi
Run Code Online (Sandbox Code Playgroud)
什么[ -t 1 ]意思?
这是真的吗?
那么,我可以这样做吗?
exec zsh
Run Code Online (Sandbox Code Playgroud) 我正在编写一个 bash 脚本,突然这种行为开始了:
[[ 1 < 2 ]]; echo $? # outputs 0
[[ 2 < 13 ]]; echo $? # outputs 1
Run Code Online (Sandbox Code Playgroud)
但-lt运行良好:
[[ 1 -lt 2 ]]; echo $? # outputs 0
[[ 2 -lt 13 ]]; echo $? # outputs 0
Run Code Online (Sandbox Code Playgroud)
我不小心<以某种方式覆盖了吗?
这是我编写的用于测试此行为的脚本:
#!/bin/bash
for a in {1..5}
do
for b in {1..20}
do
[[ $a < $b ]] && echo $a $b
done
echo
done
Run Code Online (Sandbox Code Playgroud)
这是输出:
1 2
1 3
1 4 …Run Code Online (Sandbox Code Playgroud) 这个问题是关于 ZSH,而不是 bash。
我的.zshrc文件中有以下几行。每当我打开一个终端时,我都会收到一个no matches found错误,引用带有if语句的行。
if [[!( -a ~/.zkbd/$TERM-${${DISPLAY:t}:-$VENDOR-$OSTYPE} )]]; then
zkbd
fi
Run Code Online (Sandbox Code Playgroud)
我通读了 ZSH 文档,我的if陈述似乎是正确的。我不明白为什么我收到错误。
zkbd如果文件.zkbd夹中的文件不存在,我想要发生的是让实用程序运行。
假设我有这个简单的代码:
echo "Are there any arguments?"
if [ $# -eq 0 ]; then
echo "false"
else
echo "true"
fi
Run Code Online (Sandbox Code Playgroud)
如您所见,最好有机会直接打印条件结果,但我不知道该怎么做。
它会是这样的:
echo "$([ $# -eq 0 ])"
但它不是那样工作的。我们可以在没有的情况下做到这一点if吗?
在执行此操作时,我得到了预期的结果bash:
[ "a" == "a" ] && echo yes
Run Code Online (Sandbox Code Playgroud)
它给了我yes。
但是当我在 中执行此操作时zsh,我得到以下信息:
zsh: = not found
Run Code Online (Sandbox Code Playgroud)
为什么相同的命令 ( /usr/bin/[) 在不同的 shell 中表现不同?
做
if [[ "$1" = pattern ]]; then
hook
fi
Run Code Online (Sandbox Code Playgroud)
总是表现得一样
case "$1" in
pattern) hook;;
esac
Run Code Online (Sandbox Code Playgroud)
或者有什么问题吗?
来自man bash:
CONDITIONAL EXPRESSIONS
[...]
-a file
True if file exists.
[...]
-e file
True if file exists.
Run Code Online (Sandbox Code Playgroud)
[ -a $FILE ]和之间有什么区别[ -e $FILE ],如果有的话?test ×10
bash ×7
shell ×3
zsh ×3
command-line ×1
coreutils ×1
linux ×1
numeric-data ×1
shell-script ×1
string ×1
utilities ×1
wildcards ×1