标签: bash-scripting

如何从 bash 脚本中的列表连接字符串?

举个例子:

List="A B C D"
for I in $List
do
    OUT=$OUT" -$I"
done
Run Code Online (Sandbox Code Playgroud)

当我运行它时,结果是:

" -A -B -C -D"
Run Code Online (Sandbox Code Playgroud)

但希望它是:

"-A -B -C -D"
Run Code Online (Sandbox Code Playgroud)

如何在没有前导空格的情况下进行连接?

顺便说一句,这是脚本的参数列表。

script shell-script bash-scripting

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

使用 Bash 脚本删除整个目录中的所有文件(四个最新的除外)

我正在寻找一个 Bash 脚本,该脚本将进入目录列表并删除除最近创建的四个文件之外的所有文件。

我怎样才能做到这一点?

linux bash bash-scripting

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

如何使 sed 省略不匹配的行?

在以下示例中,sed匹配以 ana或 a开头的行c并打印该行的第一个字符 ( aor c):

$ echo "ag
bh
ci
dj
ek
fl" | sed 's/\(a\|c\)./\1/' # Matches lines starting with 'a' or 'c'.

output:
a
bh
c
dj
ek
fl
Run Code Online (Sandbox Code Playgroud)

但是,与模式不匹配的行也会被打印出来。我如何告诉sed省略与模式不匹配的行?我可以通过将其与grep(如下)结合来获得所需的效果,但我想知道是否sed可以“单独”实现。

$ echo "ag
bh
ci
dj
ek
fl" | grep '[ac]' | sed 's/\(a\|c\)./\1/'

output:
a
c
Run Code Online (Sandbox Code Playgroud)

regex sed bash-scripting

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

我将使用哪些命令来连续创建两个子进程?

我想生成两个子进程,但是要等到第一个子进程到达执行中的某个点(可以通过检查 stdout 来确定),然后再生成第二个子进程。我不确定哪些 unix 命令会参与完成这个任务,并且由于 unix 命令名称的简洁和有时神秘的性质,很难通过谷歌找到任何东西。

我不是在寻求解决我正在尝试解决的特定问题的解决方案(尽管任何额外的指针都会受到赞赏),我主要关心的是知道我想要查找和学习使用哪些 unix 命令。

bash bash-scripting

8
推荐指数
3
解决办法
922
查看次数

用于将显示器输入从 HDMI 切换到 DisplayPort 的 Bash 脚本,反之亦然

我使用 ddcutil 作为命令行替代方案,以代替物理按下显示器上的按钮将输入从 HDMI 更改为 DisplayPort,并最初将其设置为使用两个命令从一个切换到另一个 -

  1. ddcutil -d 1 setvcp 60 0x0f告诉显示器切换到 DisplayPort(-d 1 是“显示 1”,“setvcp”是更改设置的命令,“60”是显示器的输入功能代码,“0x0f”是显示端口代码) 和

  2. ddcutil -d 1 setvcp 60 0x11与 HDMI 代码“0x11”相同

这两个命令成功运行并且符合预期。

目前我需要帮助的是创建一个脚本来检查监视器的当前状态,并根据当前状态切换到其他输入。这样我就可以将脚本绑定到键盘上的单个“切换”按钮,而不是使用两个单独的按钮,一个用于 DP,一个用于 HDMI。

ddcutil 的手册页表明该命令ddcutil -d 1 getvcp 60 --brief将返回监视器的当前状态 - 我尝试了这个,它似乎在显示端口上工作;显示端口上的输出是:VCP 60 SNC x0f。当我切换到 HDMI 并运行相同的命令时,输出是相同的:“VCP 60 SNC x0f”。

所以这可能确实是一个双管齐下的问题:

  1. 您能帮我弄清楚为什么在 HDMI 上 getvcp 命令没有返回预期的“VCP 60 SNC x11”吗?我认为弄清楚这一点可能是我的第二个问题的先决条件:
  2. 你能帮我写一个如上所述的 bash 脚本吗?

display bash bash-scripting

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

为什么有些命令不接受输入重定向?

例如,回声

[aesteban@localhost ~]$ cat tmp.txt 
Angel
[aesteban@localhost ~]$ echo < tmp.txt

[aesteban@localhost ~]$
Run Code Online (Sandbox Code Playgroud)

如您所见,输出只是一个空行。根据我的阅读,一些命令能够进行输入重定向,例如mail

[aesteban@localhost ~]$ mail barney@example.com < tmp.txt 
Run Code Online (Sandbox Code Playgroud)

那么输入重定向仅适用于交互式命令(能够等待输入的命令)吗?如何确定命令是否是交互式的(除了尝试之外)?

bash bash-scripting fedora-20

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

如何使用命令行更改/添加跟踪器到 .torrent 文件?

我在 Debian 上使用传输守护程序来处理我的种子。

目前,我一直在使用网站http://torrenteditor.com/将跟踪器添加到 .torrent 文件。

我想直接使用 Linux 命令行编辑 .torrent 文件,并轻松更改关联的跟踪器(或添加一个,如果可能的话)。

是否可以?

linux bash transmission bash-scripting

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

cp: 无法统计 '/some/path/*': 没有那个文件或目录

我的脚本代码是:

var="/some/path"
cp "$var*" "/another/path"
Run Code Online (Sandbox Code Playgroud)

然后它抛出:

cp: cannot stat '/some/path/*': No such file or directory
Run Code Online (Sandbox Code Playgroud)

我试过这个并得到同样的错误:

cp "${var}*" "/another/path"
Run Code Online (Sandbox Code Playgroud)

最后,我通过以下方式解决了这个问题:

cp "$var"* "/another/path"
Run Code Online (Sandbox Code Playgroud)

这次命令成功执行,但我想知道为什么。

你能给出一个解释吗?

linux bash-scripting

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

带空格的 Bash 变量(目录)

我试图在/foo保留列出目录中的空格的同时回显所有文件。目前,名为目录"bar1 bar2"将回声出作为/path/to/foo/bar1/然后/bar2file.txt全部上新的生产线。我需要它来 echo/path/to/foo/bar1 bar2/file.txt/path/to/foo/bar1\ bar2/file.txt.

for file in $(find /path/to/foo/ -type f); do
  if [[ ... ]]; then
    echo "${file}"
  fi
done
Run Code Online (Sandbox Code Playgroud)

还试过:

for file in $(find /path/to/foo/ -type f | sed 's/ /\ /g'); do
  if [[ ... ]]; then
    echo "${file}"
    echo "$file" # variations i've tried
    echo $file   # variations i've tried
    echo ${file}
    otherCommand "${file}"
  fi
done
Run Code Online (Sandbox Code Playgroud)

linux bash shell ubuntu bash-scripting

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

在 Bash 中将文本动态附加到文件名

我有以下for循环来单独处理sort文件夹内的所有文本文件(即为每个文件生成一个排序的输出文件)。

for file in *.txt; 
do
   printf 'Processing %s\n' "$file"
   LC_ALL=C sort -u "$file" > "./${file}_sorted"  
done
Run Code Online (Sandbox Code Playgroud)

这几乎是完美的,除了它当前以以下格式输出文件:

originalfile.txt_sorted
Run Code Online (Sandbox Code Playgroud)

...而我希望它以以下格式输出文件:

originalfile_sorted.txt 
Run Code Online (Sandbox Code Playgroud)

这是因为该${file}变量包含文件名,包括扩展名。我在 Windows 上运行 Cygwin。我不确定这在真正的 Linux 环境中会如何表现,但在 Windows 中,这种扩展名的转换会使 Windows 资源管理器无法访问该文件。

如何将文件名与扩展名分开,以便我可以_sorted在两者之间添加后缀,从而轻松区分文件的原始版本和排序版本,同时仍保持 Windows 的文件扩展名不变?

我一直在看什么或许可能的解决方案,但对我来说,这些似乎更配备以处理更复杂的问题。更重要的是,以我目前的bash知识,它们超出了我的头脑,所以我希望有一个更简单的解决方案适用于我的简陋for循环,或者有人可以解释如何将这些解决方案应用于我的情况。

windows cygwin bash filenames bash-scripting

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