下面是我用来找出删除sed
人名中空格的命令的演示的完整副本,并将其压缩为没有空格。
完成后,我想将它分配给变量,comp
然后我可以稍后在脚本中重新使用它。在这里,我只是尝试将echo
其发送到标准输出,这样我就可以看到它起作用了。
如果我运行脚本并输入我的名字,Ronald McDonald
我得到的结果是RonaldMcDonald}
他名字末尾的花括号,或者我输入的任何内容。
我如何让它工作,以便结果不会将 附加}
到指定文本的后面。
#!/bin/bash
function readName {
echo "Enter your full name:"
read fullName
clear
} # end readName
function cmprsName {
comp={ echo "$fullName" } | sed 's/ //g'
} # end cmprsName
function sayItNow {
echo $comp
} # end sayItNow
function allTogether {
readName
cmprsName
sayItNow
} #end allTogether
case $1 in
-h | --help ) allTogether
exit
;;
* ) echo …
Run Code Online (Sandbox Code Playgroud) 有没有办法自动安装软件包及其依赖项,就像apt-get -y
在 Debian 中一样,而不会每次都被提示?
一步安装 Webmin、NGiNX 和 nano,自动安装它们的所有依赖项:
sudo apt-get -y install webmin nginx nano
Run Code Online (Sandbox Code Playgroud)
在 FreeBSD 10 上,(我还在习惯 Ports)我会输入:
pkg install webmin nginx nano
Run Code Online (Sandbox Code Playgroud)
如果我附加-y
开关,它就会失败。我查看了meBSD和FreeBSD 手册中的文档,似乎没有选项/开关可供使用。任何人的想法?
我注意到对于bash
脚本,有些人使用了与我习惯放在自己顶部的不同的
shebang。
有人可以简化这两者之间的区别吗?我一直用那个#!/bin/bash
。
#!/bin/bash
#!/usr/bin/env bash
Run Code Online (Sandbox Code Playgroud) 我有一个使用%20表示名称中的空格的文件列表。
我目前正在尝试执行以下操作,将它们全部从 %20 更改为空格“”。
for x in *.txt
do mv $x $(echo $x | sed -e 's/%20/ /')
done
Run Code Online (Sandbox Code Playgroud)
这玩意不好。它吐出这个:
usage: mv [-f | -i | -n] [-v] source target
mv [-f | -i | -n] [-v] source ... directory
Run Code Online (Sandbox Code Playgroud)
但是当我导入它们时,我对我的一些图像做同样的事情并且它工作正常:
for x in *_MG*.CR2
do mv $x $(echo $x | sed -e 's/_MG/_IMG/')
done
Run Code Online (Sandbox Code Playgroud)
忘记一个正在使用.TXT而另一个是.CR2,我在这里完全忽略了什么?
请记住,我使用的是工作笔记本电脑,因此我无法添加 Homebrew 来安装任何其他软件。它是用于操作系统的 Mac OS X。
以下是我目前用于测试 Debian 版本的内容。而不是这样做,我可以让它更简洁吗?
#!/bin/bash
VERSION=NONE
if [ $(cat /etc/debian_version) == '7.3' ]; then
VERSION=7
elif [ $(cat /etc/debian_version) == '7.2' ]; then
VERSION=7
elif [ $(cat /etc/debian_version) == '7.1' ]; then
VERSION=7
elif [ $(cat /etc/debian_version) == '7.0' ]; then
VERSION=7
fi
Run Code Online (Sandbox Code Playgroud)
我知道这不是最吸引人的方式。我想要的是了解如何使用文件 at/etc/debian_version
读取之前的版本号.
并忽略之后的版本号。
我尝试使用
if [ $(cat /etc/debian_version) == '7.*' ]; then
Run Code Online (Sandbox Code Playgroud)
我也试过
if [ $(cat /etc/debian_version) == '7.2|7.1|7.0' ]; then
Run Code Online (Sandbox Code Playgroud)
但这些都不适合我。我想将来证明我的脚本,这样如果 Debian 7.4 发布,那么我就不必回顾所有依赖于此的脚本并更改它们
我也知道lsb_release -a
向我展示了相关信息,我只是不知道如何从中“剪切”我想要的内容并检查它是否是 Debian 6 或 7。正如您想象的那样,原始脚本很长.
您可以指向我的任何其他帖子,也将使用“切割”方法将响应分开以仅划分出我想要的部分,这也将不胜感激。
是否有if
用于 bash 脚本的所有开关的列表?有时我看到有人在使用它,我想知道他们使用的开关实际上是做什么的。
例子是-z
在这个。我知道如何使用它,但我不知道它来自哪里。
if [ -z "$BASH_VERSION" ]; then
echo -e "Error: this script requires the BASH shell!"
exit 1
fi
Run Code Online (Sandbox Code Playgroud)
任何参考,指南,帖子,答案将不胜感激。谢谢!
我正在研究这个解决方案:使用 sed 编辑带有变量的文件中的行并尝试将其应用于我的情况,但我最近才发现sed
并且还没有掌握它。
如果我有一个文件/tmp/mary.txt
,它看起来像这样:
Mary had a little lamb
with fleece as white as
snow. Everywhere that
Mary went, the lamb was
sure to go.
Run Code Online (Sandbox Code Playgroud)
我想替换此文件中的一行文本,特别是:
Mary had a little lamb
-> Mary had 2 little lambs
我用过这个:
sed -i 's/*.had a little lamb.*/Mary had $(nproc) little lambs/' /etc/mary.txt
Run Code Online (Sandbox Code Playgroud)
我使用-i
的就地和s/
对替代品,它抛出错误:
sed: 1: "mary.txt": extra characters at the end of g command
Run Code Online (Sandbox Code Playgroud)
我想做的另一件事是用结果替换第一行中的“lamb”一词 echo $PATH
sed -i …
Run Code Online (Sandbox Code Playgroud) bash ×4
shell-script ×4
bash-script ×3
sed ×3
awk ×1
debian ×1
executable ×1
filenames ×1
freebsd ×1
shebang ×1
terminal ×1