我正在寻找 unix 系统管理中的一些常见问题以及 shell 脚本可以解决这些问题的方法。完全出于自我教育的目的。另外,我想知道您将如何学习 shell 脚本。
在 bash 中使用命令时,我喜欢使用双选项卡选项来显示可用命令。一些命令比其他命令有更多可能的匹配:
选项卡完成的屏幕截图 http://img13.imageshack.us/img13/5541/picturemhy.jpg
有没有办法将双选项卡的输出通过管道传输到 somwehere,例如grep?我找到了一个相关的帖子,但我仍然不确定如何实现它以将其通过管道传输到 grep。
我有一个脚本,将 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) 这是我第一次编写 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. 那么有人可以告诉我它有什么问题吗?
我正在编写一个 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) 是否有方法/命令来检查 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 的方式来让它根据需要工作,但如果可能的话,我想避免这种情况,并学习正确的方法来做这件事。
根据上次修改日期递归地对目录中的文件进行排序
我修改了目录中的很多文件,想通过按上次修改日期对它们进行排序来了解这些文件是什么,并且我希望排除某些扩展名
在 svn 目录中,我也有很多 .svn 文件,我不想在排序中显示
我是 Linux 的新手用户,使用 Linux mint 17.1
我在过去 3 天内为该问题重新安装了 Linux Mint 20 次,但无法修复它
我正在尝试使用 rvm 在 rails 上安装 ruby .
通过在过去 3 天内重新安装它超过 20 次,我也在网上搜索过。有人告诉我将环境变量放入/etc/environment我在该会话中回显的路径中并将其粘贴到/etc/environment文件中。
即使现在我也没有得到我安装的 gems
当我输入时rvm -v出现以下错误
Warning: PATH set to RVM ruby but GEM_HOME and/or GEM_PATH not set, see:
https://github.com/wayneeseguin/rvm/issues/3212
Warning! PATH is not properly set up, $GEM_HOME is not set,
usually this is caused by shell initialization files - check them for 'PATH=...' entries,
it might also help to re-add …Run Code Online (Sandbox Code Playgroud) 我想编写一个脚本来仅返回输入文件名的扩展名。例如,textfile.txt
应该返回txt.
我是 Linux 和 bash 的新手,我正在尝试学习如何编写基本脚本。谢谢!
scripting ×10
bash ×7
shell ×4
shell-script ×2
autocomplete ×1
bash-script ×1
command-line ×1
find ×1
learning ×1
linux ×1
linux-mint ×1
quoting ×1
sort ×1
ubuntu ×1