小编sch*_*ity的帖子

Bash 差异或首选否定语句

bash 或语句否定的首选用法是否有区别?

if ! [[ -z "${var}" ]]; then
  do_something
fi
Run Code Online (Sandbox Code Playgroud)

相对

if [[ ! -z "${var}" ]]; then
  do_something
fi
Run Code Online (Sandbox Code Playgroud)

bash shell-script test

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

Linux 上的虚拟接口

我需要在 Linux 上创建第二个单独的虚拟接口。

我选择dummy。并执行以下步骤:

$ cat /etc/modules-load.d/dummy.conf
# Load dummy.ko at boot
Run Code Online (Sandbox Code Playgroud)

假的

$ cat /etc/sysconfig/network-scripts/ifcfg-ethdummy1
NAME=ethdummy1
DEVICE=ethdummy1
MACADDR=00:22:22:ff:ff:ff
IPADDR=10.10.10.1
NETMASK=255.255.255.0
ONBOOT=yes
TYPE=Ethernet
NM_CONTROLLED=no
Run Code Online (Sandbox Code Playgroud)

似乎一切正常。但在网上我看到人们也这样做:

$ cat /etc/modprobe.d/dummy.conf 
install dummy /sbin/modprobe --ignore-install dummy; /sbin/ip link set name ethdummy1 dev dummy0
Run Code Online (Sandbox Code Playgroud)

这条线有什么意义?谢谢。

linux modprobe interface network-interface

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

基于大小重命名文件的 Bash 脚本

我有一个 bash 脚本,它根据命令提示符的输入重命名文件夹中的文件:

echo "Please rename and press enter" read rename 

if [ -z "$rename" ]; then 
  printf "no caption was selected, aborting!\n"
  exit 1
fi 

printf "rename is $rename\n" count=1

for i in *.jpg; do 
  j=printf "%04d" $count
  j="$rename"$j".jpg"
  count=$((count + 1))
  mv "$i" $j
done  
fi 
shift 
done
Run Code Online (Sandbox Code Playgroud)

如何修改此脚本,以便根据文件大小重命名文件夹中的文件?

如果我根据大小对文件进行排序,它们在文件夹中将如下所示:

a009      978kb
a001      567kb
a003      499kb
a008      432kb
Run Code Online (Sandbox Code Playgroud)

所以我想重命名生成的文件:

a001      978kb
a002      567kb
a003      499kb
a004      432kb
Run Code Online (Sandbox Code Playgroud)

rename

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

Bash sed 替换双美元符号 $$ 扩展正则表达式

这个命令:

echo '$$foo=bar' | sed -E "s/(\$\$foo=).*/\1$(echo hello)/"
Run Code Online (Sandbox Code Playgroud)

输出:

$$foo=bar
Run Code Online (Sandbox Code Playgroud)

如果我将sed's 引号更改为单引号并将命令括在双引号中:

echo '$$foo=bar' | sed -E 's/(\$\$foo=).*/\1'"$(echo hello)"'/'
Run Code Online (Sandbox Code Playgroud)

它输出所需的结果:

$$foo=hello
Run Code Online (Sandbox Code Playgroud)

所以我想问题出在扩展的正则表达式和引号上,除非我遗漏了一些明显的东西。

  1. sed在命令替换中连接单引号和双引号是一个好的做法( sed 's/foo/'"$(command)"'/')吗?

  2. 如何使用sed扩展正则表达式转义双美元符号?

sed regular-expression

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

wc -c 和 ${#} 的区别?

我创建了脚本,在那里我用 base64 编码了 28 次字符串。然后我想在输出的字符串中回显字符数。

首先我使用${#var}它给了我 34070。

然后我尝试了相同的字符串

script.sh | wc -c
Run Code Online (Sandbox Code Playgroud)

这给了我 34071。

#!/bin/bash
var="9M"
for i in {1..28};do
var=$(echo $var | base64)
done
echo ${#var}
Run Code Online (Sandbox Code Playgroud)

究竟是什么使这两个输出不同?

bash special-characters shell-script base64 wc

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

dc 和标准输入或带字符串命令的heredoc?

dc可以从文件或/和标准输入中读取命令。
如果我想打印用户输入:

cat essai_dc
[enter a number : ]
n
?
p

dc essai_dc 
  enter a number : 4
  4
Run Code Online (Sandbox Code Playgroud)

现在,如果我尝试使用heredoc

dc <<EOF
> [enter a number : ]
> n
> ?
> p
> EOF  

enter a number : dc: stack empty
Run Code Online (Sandbox Code Playgroud)

我对标准输入也一样:

cat essai_dc | dc
enter a number : dc: stack empty
Run Code Online (Sandbox Code Playgroud)

命令 ?获取p并执行它,但堆栈为空。
是否有可能让它工作(告诉dc等待输入)

shell here-document dc

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

“ps -eu”和“ps -u”有什么区别?

我查看了手册ps,它说-e将列出所有进程,而-u将列出特定用户的进程。

所以我尝试使用ps -eu myaccount | wc -l它输出280。

但如果我使用ps -u myaccount | wc -l它会输出 12。

既然两者都是为用户输出所有的过程myaccount,为什么结果会不同呢?

ps

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

链接在一起的两个范围之间的随机数输出

这个问题是关于在一个范围内生成随机数,这很好,但不适合我的情况。

\n

我将用 SQL 术语进行解释,因为在我看来,这更容易理解,尽管问题是关于bash. 我的想法是用代码的结果bash构建一个SQL脚本。

\n

我有两张 MySQL 表,一张是people,一张是places。每条记录都有一个唯一的整数 ID,范围为 1 到 139(地点)和 1 到 1519(人)。它们通过外键相互联系,意思是:一个地方可以有很多人,但一个人只能有一个地方。

\n
# 1-139  # 1-1519\nplace1 \xe2\x86\x92 person1\n       \xe2\x86\x92 person2\n       \xe2\x86\x92 person3\n       ... and so on\n
Run Code Online (Sandbox Code Playgroud)\n

我现在掌握的数据是,在一个地方所有的人都有联系,而其他地方没有任何联系。

\n

名额有139个,人数有1519人,所以我有1个名额,有1519人。

\n

我的目标是将人员随机分配到各个地方,并且每个地方至少有一个人。

\n

到目前为止我的代码是这样的:

\n
$ c=1519\n$ while [[ $c -ne 0 ]]; do \n    x=$((shuf -i 1-139 -n 1))\n    [[ $x -gt 139 ]] && continue\n    echo $x\n    (( c-- ))\n  done\n
Run Code Online (Sandbox Code Playgroud)\n

此代码生成 1-139 之间的 …

bash random numeric-data

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

vim - 如何... yank util 短语

我在最新版本的 arch linux 5.5.6-arch1-1 上使用最新版本的 vim 8.2.148。

如果我想从光标复制到句子中的一个字母,我可以这样做,例如在这句话中,如果我的光标位于句子的开头并且我想猛拉直到复制的 c 我会给出命令yuc,它将复制“如果我愿意”。

另一个同样有效的示例是从字符串的开头猛拉到此字符串中“屏幕截图”的第二个实例的开头:

/home/user/linux_config/script_yad/screenshots/change_screenshots_directory.sh
Run Code Online (Sandbox Code Playgroud)

但是,如果我的光标在这句话的开头,并且我想拉到并包括第二个句子,我该怎么做?

我认为这样的命令在结构上可能看起来像yt2"sentence"虽然这个命令不起作用。

显然,使用字母 s 进行 yank 不会令人满意。

我希望在不使用视觉模式的情况下实现这一目标。

这是否需要插件,如果需要,是哪个?

这可以在没有插件的情况下完成吗?

vim

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

如何删除目录中所有文件中两个数字之间的下划线

所以我有一个带有嵌套文件夹的目录,并且在某些时候还有.png图像。

这些图像的命名是这样的“letters_numbers_numbers_letters.png”,我想删除数字之间的下划线。

假设我们有一个名为 的文件a_1_2_b.png,我想将其重命名为a_12_b.png. 我知道我必须使用类似的东西:

find . -name "*[0-9]_[0-9]* -type f -exec bash -c <enter_code here>`
Run Code Online (Sandbox Code Playgroud)

但我不确定如何指定如何删除这个特定的下划线。请记住,还有另外两个下划线我不想碰。

提前致谢!

bash filenames rename mv

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