标签: shell-script

在 shell 脚本中实现时历史替换失败

以下命令在命令行中运行

rsync -avh -r /Source/09_03_2016/ /Destination/
echo $(basename !:3)
Run Code Online (Sandbox Code Playgroud)

输出 09_03_2016

但是当我在 shell 脚本中执行此操作时,它不起作用

#! /bin/bash

/usr/bin/rsync -avh -r /Source/09_03_2016 /Destination/;
echo $(basename !:3)
Run Code Online (Sandbox Code Playgroud)

输出!:3

bash shell-script history-expansion

-1
推荐指数
1
解决办法
873
查看次数

如何将带有多个空格的字符串分配给bash中的变量?

首先,它不像这个问题\n如何在 bash \xe2\x80\x9cuntouched\xe2\x80\x9d 中回显带有多个空格的字符串?[重复]因为在那个问题中他只想打印它,我想将它分配给变量并保存它。\n我已经尝试过这个:

\n\n
SPACE=\'  \'\nVAR="$VAR1${SPACE}$VAR2"\n
Run Code Online (Sandbox Code Playgroud)\n

shell-script variable

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

在 bash 中,从变量中删除最后一个字符

我有以下代码:

testval="aaa_bbb_ccc," 
testval+="_ddd"
echo ${testval}
Run Code Online (Sandbox Code Playgroud)

但是,我需要去掉“ ccc ”后面的逗号。${testval}在我添加“ _ddd ”之前,它将始终是最后一个字符。可能还有其他逗号需要保留在字符串中。

但到目前为止,我找不到任何有效的方法。

例如

testval="aaa_bbb_ccc," ; 
testval=${testval} | rev | cut -c 2- | rev ; testval+="_ddd" ; 
echo ${testval}
Run Code Online (Sandbox Code Playgroud)

或者

testval="aaa_bbb_ccc," ; 
testval=${testval} | sed 's/.$//' ; testval+="_ddd" ; 
echo ${testval}
Run Code Online (Sandbox Code Playgroud)

两者都导致:

aaa_bbb_ccc,_ddd
Run Code Online (Sandbox Code Playgroud)

我也试过:

testval="aaa_bbb_ccc," ; 
testval=$(${testval} | rev | cut -c 2- | rev) ; 
testval+="_ddd" ; 
echo ${testval}`
Run Code Online (Sandbox Code Playgroud)

testval="aaa_bbb_ccc," ; 
testval=$(${testval} | sed 's/.$//') ; 
testval+="_ddd" ; 
echo ${testval}
Run Code Online (Sandbox Code Playgroud)

两者都导致:

-su: {testval}: command not found**
Run Code Online (Sandbox Code Playgroud)

没有等效的或 …

bash shell-script

-1
推荐指数
2
解决办法
90
查看次数

循环访问 MAC 地址,如何在“for”循环中同时处理数字 (0-9) 和字母 (af)

我有一个带有此代码的脚本

for i in {2..9}
        do 
        grep "Node${i}\|01, source address = 00:00:00:00:00:0${i}" t1.txt > t2.txt
        done
Run Code Online (Sandbox Code Playgroud)

是否可以将循环从“9”扩展到十进制 MAC 地址的“f”字符,以便处理“a”到“f”的情况?

bash shell-script mac-address for

-1
推荐指数
1
解决办法
112
查看次数

在同一命令中重复具有不同值的标志

我会尽量保持简单。我使用sed命令编辑流的结果如下:

filename_1  
filename_2  
.  
.  
filename_n  
Run Code Online (Sandbox Code Playgroud)

现在根据上一个结果中的文件数量,我想在 shell 中执行命令,如下所示。

some_command --foo "filname_1" --foo "filename_2" --foo "filename_n" remaining_some_command
Run Code Online (Sandbox Code Playgroud)

其中 --foo 是命令和 filename_1...filename_n 之间的标志,它的值取决于sed.

在shell中应该是可能的。但是如何?

shell-script

-1
推荐指数
1
解决办法
27
查看次数

保存到变量时如何在printf中保持宽度格式?

我有以下代码

printf "%8s.%s\n" "$RANDOM" "$RANDOM" "$RANDOM" "$RANDOM" "$RANDOM" "$RANDOM" "$RANDOM" "$RANDOM"
Run Code Online (Sandbox Code Playgroud)

这产生了预期的输出

   24756.22971
    9910.13045
    7701.30924
   22972.27622
Run Code Online (Sandbox Code Playgroud)

我想用变量中的前导空格保存此输出,以供以后使用

printf -v output "%8s.%s\n" "$RANDOM" "$RANDOM" "$RANDOM" "$RANDOM" "$RANDOM" "$RANDOM" "$RANDOM" "$RANDOM"
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试打印/回显变量 $output,前导空格就会消失:

24756.22971
9910.13045
7701.30924
22972.27622
Run Code Online (Sandbox Code Playgroud)

bash shell-script

-1
推荐指数
1
解决办法
32
查看次数

为什么 2>/dev/null 不起作用?

我想在脚本开始时询问用户 sudo 密码,然后在运行脚本的其余部分之前测试该密码是否正确。

经过一段时间的搜索,我得到了这个测试脚本:

SUDO_PWD=whatever
sudo -k   # <- So I can test it
echo $SUDO_PWD | sudo -Svp '' 2>/dev/null 
sudo_response=$(SUDO_ASKPASS=/bin/false sudo -A whoami @>/dev/null) 
if [ "$sudo_response" = "root" ]; then 
    echo "sudo" 
else  
    echo "no sudo" 
fi 
Run Code Online (Sandbox Code Playgroud)

但是,即使使用 @>/dev/null 重定向,这两条消息也会出现在控制台中。为什么 ?

bash sudo shell-script

-1
推荐指数
1
解决办法
733
查看次数

删除重复行而不排序并忽略大小写

因此,假设我想删除重复行而不进行排序,就像在这个线程中一样,但我也想删除不区分大小写的重复行,而不事先将所有字符串转换为大写或小写,并保留第一个结果的大小写。我怎样才能做到这一点?

bash shell-script

-1
推荐指数
1
解决办法
197
查看次数

如何在shell脚本中提取路径的某些部分?

我有一个带有 path 的变量/usr/apps/app1/home/usera/run/10/_tmp/folder1/folder1。如何/usr/apps/app1/home/usera/run/10/_tmp在shell脚本中提取?

shell shell-script

-1
推荐指数
1
解决办法
80
查看次数

bash 脚本中的标志参数被误解为文件,“没有这样的文件或目录”

我\xe2\x80\x99m编写了一个名为video2png的简单bash脚本,使用ffmpeg将视频的某些帧转换为png:

\n
#!/bin/bash\nffmpeg -ss 30:00 -i "$1" -frames 1 -s 1280x880 -f image2 "$2"\n
Run Code Online (Sandbox Code Playgroud)\n

我将视频路径和所需的输出路径作为第一个和第二个参数传递给脚本。正如您在脚本中看到的,我通过"$1"和获得了这两条路径"$2"。\n我在 Mac 上的终端中运行该脚本,如下所示:

\n
Path1="/Users/jintai/Downloads/demon/a b/demon.mp4"\nPath2="/Users/jintai/Downloads/demon/a b/demon.png"\nbash video2png "$Path1" "$Path2" \n
Run Code Online (Sandbox Code Playgroud)\n

-frames但是,脚本中的标志参数似乎ffmpeg被误解为视频路径下的文件,因为我收到以下错误消息:

\n
Trailing option(s) found in the command: may be ignored.\n-frames: No such file or directory\n
Run Code Online (Sandbox Code Playgroud)\n

我该如何解决这个问题?感谢您的时间和建议!

\n
\n

编辑:根据@muru的建议,我用-xafter运行我的脚本bash。但问题仍然在这里。这是我的运行和所有输出:

\n
(base) jintai@192 missing % bash -x video2png "$Path1" "$Path2" \n+ ffmpeg -ss 30:00 -i -frames 1 -s …
Run Code Online (Sandbox Code Playgroud)

bash ffmpeg shell-script

-1
推荐指数
1
解决办法
96
查看次数