标签: scripting

学习 shell 脚本的实际任务

我正在寻找 unix 系统管理中的一些常见问题以及 shell 脚本可以解决这些问题的方法。完全出于自我教育的目的。另外,我想知道您将如何学习 shell 脚本。

shell scripting learning

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

如何通过管道传输“选项卡完成”显示的命令列表?

在 bash 中使用命令时,我喜欢使用双选项卡选项来显示可用命令。一些命令比其他命令有更多可能的匹配:

选项卡完成的屏幕截图 http://img13.imageshack.us/img13/5541/picturemhy.jpg

有没有办法将双选项卡的输出通过管道传输到 somwehere,例如grep?我找到了一个相关的帖子,但我仍然不确定如何实现它以将其通过管道传输到 grep。

command-line scripting bash autocomplete

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

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

我有一个脚本,将 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
查看次数

根据上次修改日期递归地对目录中的文件进行排序

根据上次修改日期递归地对目录中的文件进行排序

我修改了目录中的很多文件,想通过按上次修改日期对它们进行排序来了解这些文件是什么,并且我希望排除某些扩展名

在 svn 目录中,我也有很多 .svn 文件,我不想在排序中显示

shell scripting find sort

11
推荐指数
4
解决办法
3万
查看次数

如何设置 Ruby GEM_HOME 和 GEM_PATH

我是 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)

linux scripting ubuntu environment-variables linux-mint

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

bash:你如何返回文件扩展名?

我想编写一个脚本来仅返回输入文件名的扩展名。例如,textfile.txt 应该返回txt.

我是 Linux 和 bash 的新手,我正在尝试学习如何编写基本脚本。谢谢!

scripting bash

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