小编Maj*_*imi的帖子

为什么不带引号的带空格的参数扩展在双括号“[[”内起作用,而在单括号“[”内不起作用?

我对使用单括号或双括号感到困惑。看看这段代码:

dir="/home/mazimi/VirtualBox VMs"

if [[ -d ${dir} ]]; then
    echo "yep"
fi
Run Code Online (Sandbox Code Playgroud)

尽管字符串包含空格,但它工作得很好。但是当我将其更改为单括号时:

dir="/home/mazimi/VirtualBox VMs"

if [ -d ${dir} ]; then
    echo "yep"
fi
Run Code Online (Sandbox Code Playgroud)

它说:

./script.sh: line 5: [: /home/mazimi/VirtualBox: binary operator expected
Run Code Online (Sandbox Code Playgroud)

当我将其更改为:

dir="/home/mazimi/VirtualBox VMs"

if [ -d "${dir}" ]; then
    echo "yep"
fi
Run Code Online (Sandbox Code Playgroud)

它工作正常。有人可以解释发生了什么吗?什么时候应该在变量周围分配双引号,"${var}"以防止空格引起的问题?

bash ksh quoting test

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

为什么我们应该一起使用 create 和 copytruncate ?

Geek Stuff有一个关于logrotate. copytruncate将复制并截断原始日志文件。

那我们为什么要使用create?原始日志文件尚未删除。

/tmp/output.log {
  size 1k
  copytruncate
  create
  compress
  compresscmd /bin/bzip2
  compressext .bz2
  rotate 4
  maxage 100
}
Run Code Online (Sandbox Code Playgroud)

另一个问题是有什么用maxage 100?该rotate 4指令将在 4 次轮换后删除旧的日志文件。

logrotate

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

用双反斜杠转义一个点 - awk

“有效的 awk 编程”一书中有一个关于字段拆分的示例。这是示例:

如果您希望字段由文字句点后跟任何单个字符分隔,请使用‘FS = "\\.."’.

为什么是双反斜杠?不应该\..吗?

awk regular-expression

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

在 bash 中的 if 子句中使用正则表达式

看看这个 if 块:

#!/bin/bash

str="m.m"
if [[ "${str}" =~ "m\.m" ]]; then
    echo "matched"
else
    echo "not matched"
    exit 1
fi

exit 0
Run Code Online (Sandbox Code Playgroud)

这应该打印“匹配”,但它没有。我哪里错了?

bash regular-expression

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

如何以便携的方式找到 bash

当我们编写 shell 脚本时,我们这样做:

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

但是如果 bash 在里面/usr/bin/呢?我们如何在脚本中以可移植的方式找到它?我这样做了,但它给出了错误:

#!which bash
Run Code Online (Sandbox Code Playgroud)

bash

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

tr 命令中 --squeeze-repeats 有什么好处

当我们使用-s或时有什么好处?有什么实际用途?--squeeze-repeatstr

tr

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

命令像 wc 但有 tee 行为

我想使用psqlCOPY命令备份数据库。这是我的脚本:

psql "user=${USERNAME} host=${HOSTNAME} dbname=${DBNAME} password=${PASSWORD}" -c \
"COPY (SELECT * FROM tbl) ORDER BY id ASC) TO STDOUT WITH CSV HEADER;" | \
bzip2 -z -f --best -c > /home/${DBNAME}-${FILENAME}.csv.bz2
Run Code Online (Sandbox Code Playgroud)

另外我想知道从数据库中复制了多少行,但 psql 没有这样的功能。所以我需要外部命令。我需要这样的东西:

psql ... | wc -l | bzip2
Run Code Online (Sandbox Code Playgroud)

有什么解决办法吗?我发现的唯一解决方案是使用fifo:

mkfifo /home/backup.fifo
psql ... | tee /home/backup.fifo | bzip2
Run Code Online (Sandbox Code Playgroud)

现在从另一个终端窗口我可以使用wc

wc -l /home/backup.fifo
Run Code Online (Sandbox Code Playgroud)

pipe io-redirection text-processing tee wc

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

使用 sed 替换第三次出现的模式

这是一个sed命令。我想替换第三次出现的00to11

echo "0000000000000000" | sed -e 's/00/11/3'
Run Code Online (Sandbox Code Playgroud)

输出是:

0000110000000000
Run Code Online (Sandbox Code Playgroud)

但我认为输出将是:

0011000000000000
Run Code Online (Sandbox Code Playgroud)

第一次出现00

{00}00000000000000
Run Code Online (Sandbox Code Playgroud)

第二个:

0{00}0000000000000
Run Code Online (Sandbox Code Playgroud)

第三个:

00{00}000000000000
Run Code Online (Sandbox Code Playgroud)

有人可以解释发生了什么吗?

sed regular-expression

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

在 ext4 文件系统中禁用日志 vs 数据=写回

使用以下命令在 ext4 文件系统上禁用日志有什么区别:

tune2fs -O ^has_journal /dev/sda1
Run Code Online (Sandbox Code Playgroud)

data=writeback在安装时使用?我想ext4 - journal = ext2。意味着当我们从 ext4 文件系统中删除日志时,它会自动转换为 ext2(因此我们无法从其他 ext4 功能中受益)

filesystems ext4 ext2 journaling

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

在管道中使用名称中包含空格的文件

我有play一个名为的文件夹,其中包含一个文件damn file(带空格)。当我使用find和管道输出到tar

find play/ -name 'damn*' | tar cf archive.tar -T -
Run Code Online (Sandbox Code Playgroud)

它完美地工作。为什么这有效find包含应该导致问题的空间的输出tar. 当我使用此命令时:

tar cf archive.tar $(find play/ -name 'damn*')
Run Code Online (Sandbox Code Playgroud)

bash 显示这些错误:

tar: play/damn: Cannot stat: No such file or directory
tar: file: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
Run Code Online (Sandbox Code Playgroud)

我糊涂了。为什么第一个例子有效?

shell tar pipe find whitespace

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