Questions tagged «shell-script»

有关shell脚本,由shell解释的可执行文件(bash,zsh等)的问题。


4
如果不是root用户,如何停止脚本运行(并回显“不是root用户运行!正在退出...”)
这是我的资料来源: #!/bin/bash echo "Running script to free general cached memory!" echo ""; echo "Script must be run as root!"; echo ""; echo "Clearing swap!"; swapoff -a && swapon -a; echo ""; echo "Clear inodes and page file!"; echo 1 > /proc/sys/vm/drop_caches; echo ""; 它清除缓存和内容,并回显它需要以root用户身份在终端中运行。我基本上只是希望脚本检测到没有以root身份执行时停止运行。 例: "Running script to free general …


2
如何获取以sudo执行bash脚本的用户名?
我想创建一个必须使用sudo执行的bash脚本,但应考虑执行它的非sudo用户的名称。因此,如果用户bob运行,sudo ./myscript.sh我想myscript.sh知道bob是执行它的那个人。 让我们看看里面myscript.sh: USER=$(whoami) # Do something that takes into account the username. 我怎么知道产生该过程的用户名?更具体地讲,我应该怎么用的,而不是whoami来获得bob,而不是root?

4
运行Shell脚本时提示用户以root用户身份登录
我遇到的问题是,当我输入命令时, su - root 在我的shell脚本文件的开头,它会提示用户输入密码,然后它不与外壳脚本的其余部分继续。然后,我必须通过终端手动定位并运行Shell脚本。我希望脚本确保用户以root用户身份登录,然后继续执行其余的Shell脚本。 换句话说,我想以任何用户身份运行脚本,但是一旦脚本开始执行,用户必须更改为root用户,然后以root用户身份继续其余脚本,直到完成。能做到吗?

3
在制表符分隔的文件中添加值列
如何在具有一定行数的文件中添加一列值。我有一个像这样的输入文件: 输入文件: SPATA17 1 217947738 LYPLAL1 1 219383905 FAM47E 4 77192838 SHROOM3 4 77660162 SHROOM3 4 77660731 SHROOM3 4 77662248 输出文件: SPATA17 1 217947738 file1 LYPLAL1 1 219383905 file1 FAM47E 4 77192838 file1 SHROOM3 4 77660162 file1 SHROOM3 4 77660731 file1 SHROOM3 4 77662248 file1 在这种情况下,我想添加一列值,直到文件中的行数。该值保持一致,例如“ file1”。 原因是我有100个这些文件,我不想打开每个文件并粘贴一列。也可以通过进入目录并添加一列值来实现此目的的自动化。该值来自文件名,该文件名必须添加到文件的最后/第一列的每一行中。

2
根据bash脚本中的模式提取字符串
在bash中,假设我有一个字符串strname: strname="ph7go04325r" 我想提取第一个 "3"字符和最后一个 字符之间的"r"字符strname,并将结果保存在字符串中strresult。在上面的示例中,结果strresult将是: strresult="25" 第一"3"字符是不必然在串8位strname; 同样地,最后一个"r"是不必然在串位置11。因此,下面的两个串的strname应产生strresult="25": strname="ph11go04325raa" strname="325r" strname="rgo04325raa" 另外,strname=ph12go04330raa"应屈服strresult="30"。 我是bash脚本的新手,而且我不知道从哪里开始像这样进行字符串模式匹配。你有什么建议吗?


3
哪个外壳解释器运行没有shebang的脚本?
假设我帐户的默认外壳是zsh,但是我打开了终端并启动了bash并执行了一个名为的脚本prac002.sh,那么该外壳解释器将用于执行zsh或bash脚本?考虑以下示例: papagolf@Sierra ~/My Files/My Programs/Learning/Shell % sudo cat /etc/passwd | grep papagolf [sudo] password for papagolf: papagolf:x:1000:1001:Rex,,,:/home/papagolf:/usr/bin/zsh # papagolf's default shell is zsh papagolf@Sierra ~/My Files/My Programs/Learning/Shell % bash # I fired up bash. (See that '%' prompt in zsh changes to '$' prompt, indicating bash.) papagolf@Sierra:~/My Files/My Programs/Learning/Shell$ ./prac002.sh …

4
如何使用变量作为大小写条件?
我试图使用由具有分离的不同的字符串变量|作为case语句测试。例如: string="\"foo\"|\"bar\"" read choice case $choice in $string) echo "You chose $choice";; *) echo "Bad choice!";; esac 我希望能够输入foo或bar执行case语句的第一部分。然而,无论是foo和bar带我去第二: $ foo.sh foo Bad choice! $ foo.sh bar Bad choice! 使用"$string"而不是$string没有区别。都不会使用string="foo|bar"。 我知道我可以这样: case $choice in "foo"|"bar") echo "You chose $choice";; *) echo "Bad choice!";; esac 我可以想到各种解决方法,但我想知道是否有可能case在bash中将变量用作条件。有可能吗?

1
删除字段值小于或等于3的行-sed或awk?
我需要删除第8个字段(列)中值等于或小于2的每一行。 我的数据如下所示: 12-31 Airport 189 379 41 49.70946503 -124.91377258 2 2880 30.8 01-01 AlberniElementary 165 331 16 49.26100922 -124.80662537 4 5760 26.1 01-09 BamfieldMarine 161 323 23 48.83490372 -125.13572693 2 2875 27.4 01-10 BamfieldMarine 161 323 23 48.83490372 -125.13572693 3 3068 38.6 我知道使用awk可以剥离所需的值并将它们打印到另一个文件,并且我知道sed可以编辑当前文件。无论哪种情况,我都需要保留原始文件。 注意:请提供您的解决方案的详尽说明。仅编写命令是不够的,请注释建议。 进一步说明:数据具有标题行,因此最可能的解决方案将需要 awk'FNR> 1' 我想?
17 shell  shell-script  sed  awk  grep 


2
如何通过脚本启动时设置全局环境变量,并使它们可用于登录前运行的应用程序?
我有一个在启动时运行的服务,在该服务中它在后台调用bash脚本,该脚本导出一些环境变量。我遇到的问题是那些环境变量没有被发送到后台进程的父级,因此一旦我的脚本执行完毕,它们就消失了。 另外,在脚本运行之后,服务会调用另一个脚本来启动我拥有的应用程序。该应用程序需要访问那些环境变量。 我运行它的RHEL系统意味着永远不会被用户登录,它只会启动并启动应用程序。我知道,父进程/ shell的环境变量实际上不能由子后台进程shell设置。 我需要一种通过服务调用的脚本来执行此操作的方法(虽然不一定在后台运行),而不是通过将其添加到服务中(对我也不起作用),而不是将其存储在/etc/environment或中.profile或诸如此类的东西。 在我的服务中,我尝试添加环境变量(不是我想做的): export TEST=192.168.1.1 我也在我的服务中尝试过此操作: TEST=192.168.1.1 export TEST=${TEST} 我尝试更改服务调用bash脚本的方式: /bin/asdf/script & 我也试过采购的脚本,使其在同一个外壳(这是我从运行了此): . ./bin/asdf/script #I'm very confused why this didn't work 我还发现这看起来很有趣,但在我看来并没有真正实现。


4
在Linux中如何使用Shell脚本用下划线替换所有文件名中的空格?
我尝试了以下shell脚本,该脚本应该替换所有xml文件名中的空格 for xml_file in $(find $1 -name "* .xml" -type f); do echo "removing spaces from XML file:" $xml_file mv "$xml_file" "${xml_file// /_}"; done 假设我有一个名为的xml文件xy z.xml,那么它给出了: removing spaces from XML file: /home/krishna/test/xy mv: cannot stat `/home/krishna/test/xy': No such file or directory removing spaces from XML file: .xml mv: cannot stat …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.