标签: scripting

如何在晚上自动使计算机静音?

我想将我的 Ubuntu 计算机设置为在晚上 9:59 到早上 8:00 之间听不到任何音频。我怎样才能做到这一点?

scripting audio

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

你能用shell脚本制作进程池吗?

假设我有大量的工作(数十个或数百个)需要做,但它们是 CPU 密集型的,并且一次只能运行少数几个。有没有一种简单的方法可以立即运行X作业并在完成后开始新的作业?我唯一能想到的是如下(伪代码):

jobs=(...);
MAX_JOBS=4;
cur_jobs=0;
pids=(); # hash/associative array
while (jobs); do
    while (cur_jobs < MAX_JOBS); do
        pop and spawn job and store PID and anything else needed;
        cur_jobs++;
    done
    sleep 5;
    for each PID:
        if no longer active; then
            remove PID;
            cur_jobs--;
done
Run Code Online (Sandbox Code Playgroud)

我觉得我的解决方案过于复杂,就像我经常做的那样。目标系统是 FreeBSD,如果可能有一些端口可以完成所有艰苦的工作,但通用解决方案或通用习惯用法会更可取。

freebsd scripting process parallelism

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

使用shebang行执行脚本更好吗?

我正在查找shebang并想知道为什么我会使用它。我可以使用以下命令执行 bash 脚本:

bash foo.sh
Run Code Online (Sandbox Code Playgroud)

或者

./foo.sh
Run Code Online (Sandbox Code Playgroud)

(在 foo.sh 中有一条 shebang 行)

每种方法的优缺点是什么,我应该默认使用哪一种?

scripting shebang

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

如何将参数 4..99 传递给另一个函数

我正在调用一个函数,我想将最多 100 个参数传递给另一个函数。我不想传递前 3 个参数,我从 param4 作为另一个程序的第一个参数开始。

我目前允许传递多达 19 个额外的

$function_under_test "$4" "$5" "$6" "$7" "$8" "$9" "${10}" "${11}" "${12}" 
  "${13}" "${14}" "${15}" "${16}" "${17}" "${18}" "${19}"
Run Code Online (Sandbox Code Playgroud)

但这对于较大的参数集来说不是很可靠。

我试过

  declare -a pass_on_params
  for ((a=2; a<$#; a++)); do
    pass_on_params+=(${@[a]})  # line 8
  done
  echo "->" $pass_on_params
Run Code Online (Sandbox Code Playgroud)

但我明白了

do_test.sh: line 8: ${@[a]}: bad substitution
Run Code Online (Sandbox Code Playgroud)

完整代码为:

do_test () {
  function_under_test=$1
  line_number=$2
  expected="$3"
  param1="$4"
  declare -a pass_on_params
  for ((a=2; a<$#; a++)); do
    pass_on_params+=(${@[a]})
  done
  echo "ppppppppp" $pass_on_params
  $function_under_test "$4" "$5" "$6" "$7" "$8" "$9" …
Run Code Online (Sandbox Code Playgroud)

scripting bash parameter function

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

vim:在搜索模式中使用 for-loop-iterator-variable

我正在尝试在 vim 搜索模式中使用 for 循环迭代器变量来确定一系列单词在文件中出现的次数。到目前为止我所做的是:

for i in range(1,40) | %s/SiTg//gn | endfor
Run Code Online (Sandbox Code Playgroud)

我需要i搜索模式中的迭代器变量%s/S\iTg//gn被 for 循环绑定。我怎样才能在vim中实现这一点?

scripting vim text-processing

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

确保文本文件中的所有行都没有相同的值

我有一个包含多行的文本文件。一些行包含相同的值。我想要的是确保所有行都没有重复或“三次重复”。

样本:

2014-11-21
2013-10-19
2013-06-09
2014-11-21
2014-11-21
2015-02-19
2012-08-12
2015-07-22
2013-06-09
Run Code Online (Sandbox Code Playgroud)

输出:

 2014-11-21
 2013-10-19
 2013-06-09
 2015-02-19
 2012-08-12
 2015-07-22
Run Code Online (Sandbox Code Playgroud)

我试过,uniq但它完全删除了所有重复的行。我想要的是保留一个。

scripting ksh aix shell-script

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

使用 Netstat 仅计算已建立、TIME_WAIT 和已关闭等待连接的脚本

我正在尝试制作一个脚本(使用 Perl,但不是必需的),它只会计算系统上已建立、Time_Wait 和 Closed_Wait 连接的数量并在终端中打印它们。到目前为止,我已经发现我可以使用:

netstat -ant | awk '{print $6}' | sort | uniq -c | sort -n
Run Code Online (Sandbox Code Playgroud)

为了打印所有连接,但是当我从脚本运行它时,它不会在终端中打印,它还为我提供了一些我不想要的连接,例如 Listen 和 Foreign。它必须只显示已建立、Time_Wait 和 Closed_Wait 的原因是因为脚本正在被监视程序使用,如果出现任何其他连接类型,该脚本将失败。任何人都可以提出建议吗?谢谢!

linux scripting ksh awk perl

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

获取一条线的不同部分

假设我有一行文本如下:

I have a nice car
Run Code Online (Sandbox Code Playgroud)

有没有什么方法可以在不将行保存到任何文件的情况下分别在不同位置获取行的不同单词(例如,我想获得“有”和“不错”的部分)。我的意思是,我想应用这样一种方法,它会直接在给定行的所需位置给我单词。有什么办法吗?

shell scripting shell-script text-processing

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

如何使用 SED 函数删除给定单词的行

我有一个文件 .txt 里面

ID       VALUE
test     value_1
testing  value_2
first    value_3
second   value_4
Run Code Online (Sandbox Code Playgroud)

我正在尝试编写一个 shell 脚本,它将删除与给定 ID 对应的行。例如,我想删除ID为“test”的行,所以我在论坛上发现可以通过以下方式使用“sed”功能:

sed -i '/test/d' file.txt
Run Code Online (Sandbox Code Playgroud)

但是,此函数也会删除 ID 为“testing”的行,因为该词与“test”一词复合。此外,该函数将检查每一行,因此如果存在带有“test”字样的值,它也会被删除。

所以,

  • 如何检查和删除 ID 列中仅包含“test”一词的每一行,因为 ID 位于每行的开头,我还可以问如何检查和删除以“test”一词开始的每一行?
  • 如何仅在 ID 为“test”而不与“test”一词复合时才能删除(在这种情况下,“testing”为 delete )
  • 功能“sed”真的够用了吗?

谢谢

shell scripting

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

文件出现在文件夹中时重命名文件

这是上下文:

在 samba 服务器上,我有一些文件夹(我们称之为 A,B,C,D ),它们应该从网络扫描仪接收文件。扫描仪呈现一个 PDF 文件,名称如下:

YYYYMMDDHHmmss.pdf

(年、月、日、时、分、秒)

我需要在这些 PDF 出现在文件夹中的那一刻或一分钟内重命名这些 PDF(我正在考虑 crontab)。

重命名必须是类似的东西

“[prefix_specific_to_the_folder]_YYYY-MM-DD.pdf”

我已经看到“date +%F”做了我想要的时间戳,我只需要在脚本中手动设置我的前缀。

我有算法,它必须是类似的东西

 "-read file.pdf
    -if the name of the file doesn't have [prefix] 
     -then mv file.pdf [prefix]_[date].pdf
    -else nevermind about that file."
Run Code Online (Sandbox Code Playgroud)

我真的很难找到正确的语法。

我更愿意检索文件创建的系统时间戳并用它重命名文件,而不是使用扫描仪生成的文件名。

scripting date rename files

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