我对使用单括号或双括号感到困惑。看看这段代码:
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}"以防止空格引起的问题?
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 次轮换后删除旧的日志文件。
“有效的 awk 编程”一书中有一个关于字段拆分的示例。这是示例:
如果您希望字段由文字句点后跟任何单个字符分隔,请使用
‘FS = "\\.."’.
为什么是双反斜杠?不应该\..吗?
看看这个 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)
这应该打印“匹配”,但它没有。我哪里错了?
当我们编写 shell 脚本时,我们这样做:
#!/bin/bash
Run Code Online (Sandbox Code Playgroud)
但是如果 bash 在里面/usr/bin/呢?我们如何在脚本中以可移植的方式找到它?我这样做了,但它给出了错误:
#!which bash
Run Code Online (Sandbox Code Playgroud) 我想使用psql和COPY命令备份数据库。这是我的脚本:
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) 这是一个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)
有人可以解释发生了什么吗?
使用以下命令在 ext4 文件系统上禁用日志有什么区别:
tune2fs -O ^has_journal /dev/sda1
Run Code Online (Sandbox Code Playgroud)
并data=writeback在安装时使用?我想ext4 - journal = ext2。意味着当我们从 ext4 文件系统中删除日志时,它会自动转换为 ext2(因此我们无法从其他 ext4 功能中受益)
我有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)
我糊涂了。为什么第一个例子有效?