相关疑难解决方法(0)

双方括号[[]]比Bash中的单方括号[]更好吗?

最近在一次代码审查中,一位同事声称该[[ ]]构造比[ ]在类似的构造中更受欢迎

if [ "`id -nu`" = "$someuser" ] ; then 
     echo "I love you madly, $someuser"
fi
Run Code Online (Sandbox Code Playgroud)

他无法提供理由.有吗?

syntax bash if-statement

514
推荐指数
8
解决办法
20万
查看次数

目的是什么:(冒号)GNU Bash内置?

命令的目的是什么,什么都不做,只是一个评论领导者,但实际上是一个内置的shell?

它比在每个调用中将注释插入脚本大约40%要慢,这可能会根据注释的大小而有很大差异.我能看到的唯一可能的原因是:

# poor man's delay function
for ((x=0;x<100000;++x)) ; do : ; done

# inserting comments into string of commands
command ; command ; : we need a comment in here for some reason ; command

# an alias for `true' (lazy programming)
while : ; do command ; done
Run Code Online (Sandbox Code Playgroud)

我想我真正想要的是它可能具有的历史应用.

bash shell built-in

313
推荐指数
11
解决办法
11万
查看次数

如何从函数内部确定函数名称

如果我有这样的BASH脚本:

#!/bin/bash

f() {
  # echo function name, "f" in this case
}
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?这可以用在诸如的帮助消息中

printf "Usage: %s: blah blah blah \n" $(basename $0) >&2; 
Run Code Online (Sandbox Code Playgroud)

只有在这种情况下我想要的不是$0,这是脚本的文件名.

bash function

142
推荐指数
4
解决办法
4万
查看次数

为什么shell脚本比较经常使用x $ VAR = xyes?

我经常在使用autotools(autoconf,automake)的项目的构建脚本中看到这一点.当有人想检查shell变量的值时,他们经常使用这个习惯用法:

if test "x$SHELL_VAR" = "xyes"; then
...
Run Code Online (Sandbox Code Playgroud)

与简单地检查这样的值相比,这有什么好处:

if test $SHELL_VAR = "yes"; then
...
Run Code Online (Sandbox Code Playgroud)

我认为必须有一些原因让我经常看到这一点,但我无法弄清楚它是什么.

unix shell autotools

59
推荐指数
4
解决办法
2万
查看次数

37
推荐指数
4
解决办法
2万
查看次数

数字的绝对值

我想通过bash中的以下代码取一个数字的绝对值:

#!/bin/bash
echo "Enter the first file name: "
read first

echo "Enter the second file name: "
read second

s1=$(stat --format=%s "$first")
s2=$(stat -c '%s' "$second")

res= expr $s2 - $s1

if [ "$res" -lt 0 ]
then
        res=$res \* -1
fi

echo $res
Run Code Online (Sandbox Code Playgroud)

现在我遇到的问题是在if语句中,无论我改变什么,它总是在if中,我试图放置[[ ]]声明但没有.

这是错误:

./p6.sh: line 13: [: : integer expression expected
Run Code Online (Sandbox Code Playgroud)

unix bash shell

15
推荐指数
3
解决办法
3万
查看次数

在bash中是否有内联(如果有)赋值(三元条件)?

可能重复:
Bash中的三元运算符(?:)

如果这是AS3或Java,我会做以下事情:

fileName = dirName + "/" + (useDefault ? defaultName : customName) + ".txt";
Run Code Online (Sandbox Code Playgroud)

但是在shell中,这似乎是不必要的复杂,需要几行代码,以及相当多的重复代码.

if [ $useDefault ]; then
    fileName="$dirName/$defaultName.txt"
else
    fileName="$dirName/$customName.txt"
fi
Run Code Online (Sandbox Code Playgroud)

你可以将这一切压缩成一行,但这极大地牺牲了清晰度.

有没有更好的方法if在shell 中编写带有变量赋值的内联?

bash shell if-statement operators

8
推荐指数
2
解决办法
1万
查看次数

如果启用了errexit,如何运行可能失败的命令并获取其退出代码?

我的所有脚本都打开了errexit; 就是我跑set -o errexit.但是,有时我想运行类似的命令grep,但是即使命令失败也希望继续执行我的脚本.

我该怎么做呢?也就是说,如何在不杀死整个脚本的情况下将命令的退出代码转换为变量?

我可以关闭errexit,但我不愿意.

bash

7
推荐指数
1
解决办法
749
查看次数

使用Linux工具将多行csv转换为单行

我有一个 .csv 文件,其中包含双引号多行字段。我需要将多行单元格转换为单行单元格。它没有显示在示例数据中,但我不知道哪些字段可能是多行的,因此任何解决方案都需要检查每个字段。我确实知道我会有多少列。第一行也需要被跳过。我不知道有多少数据,因此性能不是考虑因素。

我需要一些可以在 Linux 上通过 bash 脚本运行的东西。最好使用 awk 或 sed 等工具,而不是实际的编程语言。

数据将使用 Logstash 进行进一步处理,但它不处理双引号多行字段,因此需要进行一些预处理。

我尝试了类似的方法,它在一行上有效,但在多行上失败。

sed -e :0 -e '/,.*,.*,.*,.*,/b' -e N -e '1n;N;N;N;s/\n/ /g' -e b0 file.csv
Run Code Online (Sandbox Code Playgroud)

CSV 示例

First name,Last name,Address,ZIP
John,Doe,"Country

City
Street",12345
Run Code Online (Sandbox Code Playgroud)

我想要的输出是

First name,Last name,Address,ZIP
John,Doe,Country City Street,12345
Jane,Doe,Country City Street,67890
etc.
etc.
Run Code Online (Sandbox Code Playgroud)

csv bash awk sed

5
推荐指数
1
解决办法
4353
查看次数

如何知道 tar 命令何时完成?

我编写了这个脚本来从集群计算机的节点获取数据:

...
for machine in ${machines}
do
    echo "compressing data from: " ${machine}
    oarsh ${machine} "tar -zcf data_${machine}.tar.gz /tmp/data" &
done 
Run Code Online (Sandbox Code Playgroud)

我运行了脚本,当我回来时我得到了这个:

compressing data from:  machine1
...
compressing data from:  machineN
me@chinqchint-30:~$ tar: Removing leading `/' from member names
tar: Removing leading `/' from member names
tar: Removing leading `/' from member names
tar: Removing leading `/' from member names
tar: Removing leading `/' from member names
...
Run Code Online (Sandbox Code Playgroud)

而且我没有收到提示。

我使用第二个终端登录,可以看到所有.tar.gz文件都已创建,但我很担心,因为我没有拿回命令行的控制权。我可以简单地终止脚本吗?

linux bash

1
推荐指数
1
解决办法
5235
查看次数

在 bash 中检查管道输入与字符串完全匹配

如何检查管道输入是否与字符串完全匹配(最好在一行中)?

例如:

some command | <check that equals "foo" exactly>
Run Code Online (Sandbox Code Playgroud)

如果完全匹配,它将返回退出代码 0。

我尝试使用 grep,但如果输入是“foobar”,我不希望退出代码为 0,例如,只有当它恰好是“foo”时

bash

1
推荐指数
1
解决办法
852
查看次数

标签 统计

bash ×9

shell ×4

if-statement ×2

unix ×2

autotools ×1

awk ×1

built-in ×1

csv ×1

function ×1

git ×1

githooks ×1

linux ×1

operators ×1

sed ×1

syntax ×1