我一般都是Unix和Linux的新手,在if语句中无法进行逻辑比较。
我相信这是一个非常基本的错误,但我就是找不到错误。
if (7+3 == 10); then
echo "nice this works"
elif (7+3 == 73); then
echo "too bad string concatenation"
else
echo "I really don't understand shell"
fi
回声:我真的不懂贝壳。
如果我想将-a和-o脚本运算符组合在一个If语句中,我如何做到这一点?例如:
if [ ( -e file.txt -a -r file.txt ) -o ( -e file2.txt -a -r file2.txt ) ]; then .... fi
我能完成这样的事情吗?现在,当我试图运行这个程序时,我得到了一个错误。
我正在编写一个简单的脚本来检查一些存储库的更新,如果需要,我将从这些更新中生成新的包来安装它所引用的那些程序的新版本(在Arch Linux中)。所以我在执行真正的脚本之前做了一些测试。
问题在于,我从这段代码中得到了错误[: excessive number of arguments (但我认为正确的翻译应该是[: too many arguments):
# Won't work despite the double quoted $r
if [ "$r" == *"irt"* ]; then
echo "TEST"
fi
代
我不明白${}在第四个和第六个提示符中做了什么,我也找不到任何关于这方面的文档,Python for Unix and Linux System Administrator一书中有一个类似第六个提示符中的例子,在这个例子中,变量不仅被放在$的前面,而且还被封装在{}中,以便将字符串嵌入到另一个变量中,如果我引用完整的表达式,它是有效的,但是4&6中发生了什么呢?
In [1]: test = 'TEST TEST TEST!!!'
我寻找这个,但没有找到这个特殊情况的答案。我熟悉shell中的文件测试以及使用[]语法执行regex匹配。
有没有一种方法可以将这两个操作组合在不需要多个嵌套ifs的复合条件中?
到目前为止,我已经尝试了以下方法(...and其他更疯狂的变体):
if [ -e ~/.profile -a $0 =~ bash ]; then echo yes ; fi
if [ -e ~/.profile -a ( $0 =~ bash ) ]; then echo yes ; fi
if [ -e ~/.profile -a [ $0 =~ b
为了保持一致,我尝试在我的所有if语句中使用双括号[]。但是,当我要检查要运行的命令的返回值时,我确实遇到了一个问题。在测试了创建if语句的几种方法之后,我发现只有没有方括号才能执行命令。
以下内容不起作用:
if [[ $command ]] ; then
echo "something"
fi
if [[ $(command) ]] ; then
echo "something"
fi
if [[ ${command} ]] ; then
echo "something"
fi
上面的代码使if循环成为真,即使没有
我试图在bash脚本中从当前目录复制一些文件,但问题是cp命令不能与当前目录一起工作。我可以在回溯5(基于Ubuntu)上使用以下命令,但在Kali linux (基于Debian)中没有任何问题:
cp -f -v *.{html,txt,php} /var/www/
通过首先将目录更改为这些文件所在的目录,我可以直接从终端执行此命令。但是使用脚本我得到了以下错误:
cp -f -v *.{html,txt,php} /var/www/
cp: cannot stat `*.{html,txt,php}': No such file or directory
同样,当我使用Ubunt
我编写了一个脚本来获取顶级会话PID,即会话启动程序,它可能是bash、dash、ksh甚至systemd这样的shell。脚本可能得到一个PID作为初始参数,但是我需要对它进行筛选,以检查它是一个有效的整数,而不是像34fg45、-5467这样的东西,我不希望它以像05467这样的零开头。
这是脚本的片段。
if [ "$1" != "" ]; then
if [[ "$1" == [1-9]*([0-9]) ]]; then <- Check for Integer; error here in n
我正在为gnu自动工具编写一个configure.ac脚本。在我的代码中,我有一些if test语句,我希望根据编译器名称设置标志。我最初的测试是这样的:
if test "x$NETCDF_FC" = xifort; then
但有时编译器名称更复杂(例如,mpifort、mpiifort、路径前缀等),因此我想检查字符串ifort是否包含在变量$NETCDF_FC中的任何位置。
据我所知,要使用通配符或正则表达式设置比较,我不能使用test,而需要使用双括号[[ ]]。但是,当autoconf解析configure.ac以创建configure时,方括号被视为引号,因此从输
第四行的错误在哪里?
if [ $bn == README ]; then
如果我把它写成
if [ $bn == README ]
then
或
if [ "$bn" == "README" ]; then
上下文:
for fi in /etc/uwsgi/apps-available/*
do
bn=`basename $fi .ini`
if [ $bn == "README" ]
then
echo "~ ***#*** ~"
if [[ $nb_dd > 0 ]]; then
INPUT_TYPE="txt"
fi
if [ $nb_dd > 0 ]; then
INPUT_TYPE="txt"
fi
第一个检查(使用双括号)无法执行,由于没有填充$INPUT_TYPE,导致脚本在错误时退出--但后一个版本(单括号)工作,正确地设置了$INPUT_TYPE。为什么会这样呢?
我是在OS (10.11.4) (echo $SHELL = /bin/bash)上运行的--这是一个广泛分布的工具套件,这些工具都是在Linux平台上构建的--而.sh脚本在其他方
如何迭代字符串数组,并删除它们的部分值?(巴什)
我有一个数组填充了一个站点列表,这些站点被保存为字符串,我想获取其中位于'.com.au‘左边的部分,并将它们保存到一个新的数组中。字符串中也有几项不以“.com.au”结尾,我想完全忽略它们。
为了方便阅读,我删除了大部分代码,只留下了我认为与这个问题相关的内容:
#!/bin/bash
full_array(*); declare -p full_array
edited_array=()
for x in ${full_array[@]};
#If x ends with '.com.au'
我正在尝试创建一个文件夹的多个副本。然后,我要做的是更改特定文件中特定行中的一些单词,在所有文件夹中,即:
复制folderX -> folder1,folder2,.,folderN (N可以说是200)
查找文件(该文件具有特定的扩展名,例如,.txt文件位于一个装满.jpgs‘的文件夹中)
改变词,例如: sot 1 1 1 -> sot 2 2 2(每个文件将有不同的新值(一种是sot 2 2 2,另一种是sot 3 3 3等等)
到目前为止,我尝试的是,首先要复制一个文件夹:
for i in {0...200}; do cp -r test/ t