标签: scripting

文件名中有空格的脚本有问题

我有一个脚本,将 scp 的文件从远程主机传回本地。有时文件名包含空格。scp 不喜欢其文件名中的空格。出于某种原因,我处理空格的尝试没有产生正确的 scp 路径。

代码:

PATH=/var/root/Documents/MyFile OG-v1.2.3.pkg
scp $PATH Me@10.1.10.33:/Users/Me/Desktop
Run Code Online (Sandbox Code Playgroud)

结果是

Cannot find directory: var/root/Documents/MyFile
Cannot find directory: OG-v1.2.3.pkg
Run Code Online (Sandbox Code Playgroud)

将 PATH 括在引号中"$PATH"会产生相同的错误。

为转义空间交换空间也不起作用,尽管据我所知它应该:

ESC_PATH=${PATH/' '/'\ '}
Run Code Online (Sandbox Code Playgroud)

尽管打印转义路径表明编辑有效:

echo $ESC_PATH
> /var/root/Documents/MyFile\ OG-v1.2.3.pkg
Run Code Online (Sandbox Code Playgroud)

shell scripting bash quoting escape-characters

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

bash脚本中的正则表达式

这是我第一次编写 bash 脚本,所以我可能犯了一个简单的错误。

基本上,我正在尝试编写一个脚本来获取用户的组,如果他们在某个组中,它将相应地记录下来。显然会有更多的功能,但是当我什至无法让正则表达式工作时,构建它是没有意义的!

到目前为止,我有这个:

#!/bin/bash

regex="^([a-zA-Z0-9\-_]+ : [a-zA-Z0-9\-_]+) (usergroup)$"

# example output
groups="username : username usergroup"

echo "$groups" >> /home/jrdn/log

if [[ "$groups" =~ $regex ]]; then
    echo "Match!" >> /home/jrdn/log
else
    echo "No match" >> /home/jrdn/log
fi
Run Code Online (Sandbox Code Playgroud)

我尝试过该正则表达式的每个地方,它都有效。但是在 bash 脚本中,它只输出$groups, 后跟No match. 那么有人可以告诉我它有什么问题吗?

scripting bash regular-expression bash-script

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

Bash 会在保存时自动将更新重新加载(注入)到正在运行的脚本中:为什么?有什么实际用途吗?

我正在编写一个 bash 脚本,并且碰巧在脚本在while循环中等待某些输入时更新了代码(将脚本文件保存到磁盘)。在我返回终端并继续之前的脚本调用后,bash 给出了一个关于文件语法的错误:

/home/aularon/bin/script: line 58: unexpected EOF while looking for matching `"'
/home/aularon/bin/script: line 67: syntax error: unexpected end of file
Run Code Online (Sandbox Code Playgroud)

所以我尝试执行以下操作:

第一:创建一个脚本,self-update.sh我们称之为:

#!/bin/bash
fname=$(mktemp)
cat $0 | sed 's/BEFORE\./AFTER!./' > $fname
cp $fname $0
rm -f $fname
echo 'String: BEFORE.';
Run Code Online (Sandbox Code Playgroud)

脚本所做的是读取其代码,将单词“BEFORE”更改为“AFTER”,然后使用新代码重新编写自己。

2运行它:

chmod +x self-update.sh
./self-update.sh
Run Code Online (Sandbox Code Playgroud)

第三个奇迹...

aularon@aularon-laptop:~$ ./self-update.sh 
String: AFTER!.
Run Code Online (Sandbox Code Playgroud)

现在,我不会猜到在同一次调用中它会输出AFTER!,肯定会在第二次运行,但不会在第一次运行。

所以我的问题是:这是有意的(按设计)吗?还是因为 bash 运行脚本的方式?逐行或逐个命令。这种行为有什么用处吗?有什么例子吗?


编辑:我尝试重新格式化文件以将所有命令放在一行中,现在不起作用:

#!/bin/bash
fname=$(mktemp);cat $0 | sed 's/BEFORE\./AFTER!./' > $fname;cp $fname $0;rm -f …
Run Code Online (Sandbox Code Playgroud)

shell scripting bash

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

检查 bash/shell 脚本依赖项

是否有方法/命令来检查 bash 脚本的依赖关系?换句话说,对这个问题的回答:用户应该安装哪些库来运行脚本?

我可以通过阅读脚本并检查它调用的其他库/命令来手动执行此操作,但这对于长脚本而言并不明显。

scripting bash shell-script

12
推荐指数
2
解决办法
9991
查看次数

我可以在 Bash 括号扩展中使用变量吗?

以下是我要完成的某种伪代码:

#!/bin/bash

# I already have the variable below figured out (positive integer):
numlines=$([returns number of lines containing specific characters in a file])

# This is basically what I want to do with it:
for i in {1..$numlines}; do
    # the part below is already figured out as well:        
    do some other stuff
done
Run Code Online (Sandbox Code Playgroud)

通过在“{1..n}”序列中插入实际数字,我可以从命令行很好地执行它。我只需要知道是否可以在这里包含一个变量以及如何去做。

  • 我试过export
  • 我尝试将变量本身放在序列内的花括号中: {1..${numlines}}
  • 我试过把它放在双引号中,希望它能扩展: {1.."$numlines"}
  • 我试过逃避${1..\$numlines}

我是否需要使用set -[something]命令才能扩展此变量?我什至尝试过某些形式的使用eval...都无济于事。

我只需要知道我是否遗漏了一些简单或晦涩的东西,或者在我浪费时间之前这是否可能。

我可以拼凑出一种非常非常hackish 的方式来让它根据需要工作,但如果可能的话,我想避免这种情况,并学习正确的方法来做这件事。

scripting bash shell-script

12
推荐指数
3
解决办法
5162
查看次数

删除文本中字母之间多余空格的脚本

我有一个文本文档,其中包含大量文本,每个字母后都添加了一个额外的空格!

例子:

T h e  b o o k  a l s o  h a s  a n  a n a l y t i c a l  p u r p o s e  w h i c h  i s  m o r e  i m p o r t a n t…
Run Code Online (Sandbox Code Playgroud)

视觉上:

T␣h␣e␣␣b␣o␣o␣k␣␣a?l?s?o??h?a?s??a?n??a?n?a?l?y?t?i ?c?a?l??p?u?r?p?o?s?e??w?h?i?c?h??i?s??m?o?r?e??i? m?p?o?r?t?a?n?t…

请注意,每个字母后面都有一个额外的空格,因此连续单词之间有两个空格。

有没有办法获得awksed删除多余的空格?(不幸的是,这个文本文档很大,需要很长时间手动完成。)  我很欣赏这可能是一个更复杂的问题,只需一个简单的 bash 脚本即可解决,因为还需要某种文本识别。

我该如何解决这个问题?

scripting sed awk text-processing

12
推荐指数
5
解决办法
3403
查看次数

如何在 {}(花括号扩展)中获得 0 填充的数字?

我正在尝试编写一个简单的脚本来从主机列表中检索内存和交换使用情况。目前,我能够实现这一目标的唯一方法是编写 3 个单独的脚本:

for a in {1..9}; do echo "bvrprdsve00$a; $(ssh -q bvrprdsve00$a "echo \$(free -m|grep Mem|/bin/awk '{print \$4}';free -m|grep Swap|/bin/awk '{print \$4}')")"; done > /tmp/svemem.txt;
for a in {10..99}; do echo "bvrprdsve0$a; $(ssh -q bvrprdsve0$a "echo \$(free -m|grep Mem|/bin/awk '{print \$4}';free -m|grep Swap|/bin/awk '{print \$4}')")"; done >> /tmp/svemem.txt;
for a in {100..218}; do echo "bvrprdsve$a; $(ssh -q bvrprdsve$a "echo \$(free -m|grep Mem|/bin/awk '{print \$4}';free -m|grep Swap|/bin/awk '{print \$4}')")"; done >> /tmp/svemem.txt
Run Code Online (Sandbox Code Playgroud)

这样做的原因是主机名总是以 3 位数字结尾,而这些主机从 001-218 开始,所以我需要为每组 (001-009、010-099、100-218) 执行不同的 for …

scripting bash for

12
推荐指数
4
解决办法
8334
查看次数

如何在 bash 中创建按顺序编号的文件名?

我需要一个脚本来创建一个文件,其中包含一个序列中的下一个文件。脚本的每次执行应该只创建一个文件,并且脚本可以在任何一天运行零次或多次。文件应以当前日期命名,%y%m%d-01附加第二个文件,在给定日期创建的第三个文件将具有-02等。例如:

20170125.txt  // first file create on the day.
20170125-01.txt // 2nd file
20170125-02.txt // 3rd file
Run Code Online (Sandbox Code Playgroud)

到目前为止,我已经有了这个创建我的第一个每日文件的超级基本脚本,但我对在那之后如何进行增量编号感到困惑。

#! /bin/bash

DATE=`date +%Y%m%d`
touch "$DATE.txt"
Run Code Online (Sandbox Code Playgroud)

scripting bash shell-script

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

执行时从屏幕上的 shell 脚本命令获取文本输出

考虑以下 shell 脚本

val=($ls)
Run Code Online (Sandbox Code Playgroud)

ls 不提供任何 shell 文本输出。现在,我们如何在执行命令时在屏幕上获取输出文本?

我可以打印 val 的值来获取输出,但使用 echo 不是重点。因此,使用以下行并非如此

echo $val
Run Code Online (Sandbox Code Playgroud)

那么,简而言之,我如何获得在 shell 中同时执行的当前命令的输出,就像您自己执行命令一样?

shell scripting echo

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

将键与 jq 中的正则表达式匹配

我正在编写一个分析 JSON 输入 ( jsonfile)的脚本:

  {
   "key11":1010,"key11_yes":13,"key11_no":14,
   "key12":12120,"key12_yes":9,"key12_no":25,
   "key13":12103,"key13_yes":13,"key13_no":20
  }
Run Code Online (Sandbox Code Playgroud)

我想使用jq tools,并检查的值key11key12key13 就像这样:

cat jsonfile | jq 'key[1-9][1-9]'
Run Code Online (Sandbox Code Playgroud)

我希望模式像grep-style regex一样工作:

cat jsonfile | grep 'key[1-9][1-9]'
Run Code Online (Sandbox Code Playgroud)

如果匹配键的值为 null,那么我的脚本应该exit 0.

此外,我需要检查第二个参数 if key[1-9]_[this part is null](即没有附加_yes_no),然后exit 0

scripting bash shell-script json jq

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