Questions tagged «shell-script»

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

3
如何从另一个路径运行脚本,并知道脚本的路径?
我需要运行一个脚本,该脚本以与文件位于相同的路径访问文件。 例如:我有脚本/home/me/folder/script.sh,该脚本将访问文件/home/me/folder/myfile。由于文件位于脚本的相同路径中,因此我只使用name myfile而不是完整路径。 但是,如果我从运行它/tmp/,例如: /tmp$ /home/me/folder/script.sh 它给了我: myfile: No such file or directory 因此,如何在脚本中说出文件与脚本本身位于同一路径?

1
将html表转换为类似ncurses的ascii表?
我在html表中有一些文档。我想将表转换为ascii表,就像您在获得mysql命令行结果时看到的那样,如下所示: +------------+------------+ | header | header | +------------+------------+ | cell data | cell data | +------------+------------+ | cell data | cell data | +------------+------------+ ...因此我可以将其包含在一些代码注释中。 我如何轻松做到这一点?我当时正在考虑将lynx的输出传递到文件中,但是lynx不会在表周围放置ascii边框:P 我还想控制单元格的宽度,以便内容单元格不会溢出到代码可接受的屏幕宽度之外。

3
我可以使脚本使用别名而不是命令吗?
我有一个命令别名(我正在设置Python开发环境) alias python=~/virtualenv/bin/python 这样我~/virtualenv/bin/python只需输入即可运行python。现在在我的项目中有一个shell脚本,例如: #!/bin/sh python run-project.py 是否可以在不更改脚本的情况下使脚本使用别名python而不是在脚本中python找到的别名$PATH?

4
使用正则表达式(shell脚本)复制/重命名多个文件
我有一组与“ assignment02.cc”,“ assignment02.h”,“ assignment02.txt”等模式匹配的文件。我想将这些文件复制/重命名为“ assignment03.cc”,“ assignment03”。 h”,“ assignment03.txt”等。 我怀疑应该使用Shell脚本并sed来实现。到目前为止,我有: OLD_NO=$1 NEW_NO=$2 echo "Moving from $OLD_NO to $NEW_NO" for name in assignment$OLD_NO.* ; do newname=$(echo $name | sed 's/\(.*\)$OLD_NO\(.*\)/\1xx$NEW_NO\2/') echo "$name -> $newname" # mv -v $name $newname done 不幸的是,我调用sed的方式总是返回输入字符串$name,而实际上并没有进行正则表达式查找/替换。 注意:在Internet上有一个rename具有此功能的命令,但该命令在我的MacBook上不可用。

1
ksh作废-eq的原因
Ksh的最新版本已过时,不再使用-eq在[[ ]]块内使用,(( ))而是取而代之。为什么是这样?我找不到任何有关(( ))over 优势的文档[[ ]],而且我发现该语法更加明显。 例如: #!/bin/ksh var=1 if [[ $var -eq 1 ]] then echo ALPHA fi 给 [adam@hendrix test]$ ksh -n test.sh test.sh: warning: line 3: -eq within [[...]] obsolete, use ((...))

4
是否有与发行版无关的配置管理软件?
我不想将自己标记为特定的配置管理器模块,例如Ansible的apt模块或yum模块。 是否有与发行版无关的配置管理软件,或者至少有一个具有发行版不可知代码的软件来为Arch Linux安装以下软件包? 我问这个问题是因为找不到适合在Arch Linux上安装LAMP的Ansible星系角色,并且以下Debian的Bash脚本不适用于Arch: #!/bin/bash apt update -y apt upgrade ufw sshguard unattended-upgrades wget curl git zip unzip tree -y ufw --force enable ufw allow 22,25,80,443 apt upgrade lamp-server^ ssmtp -y apt upgrade python-certbot-apache -y apt upgrade php-{cli,curl,mbstring,mcrypt,gd} phpmyadmin -y


5
如何以减少的特权运行脚本的一部分?
我有以下问题:在运行Postgresql的每台计算机上,都有一个特殊的用户postgres。该用户具有对数据库服务器的管理访问权限。 现在,我想编写一个Bash脚本,该脚本以psql用户postgres的身份执行数据库命令(psql应以postgres用户的身份执行,而不是脚本)。到目前为止,这将不是问题:我可以以用户postgres的身份运行脚本。 但是,我想将psql的输出写入到postgres没有写访问权的目录中的文件中。 我怎样才能做到这一点? 我考虑过在脚本本身中更改EUID,但是: 我找不到在Bash脚本中更改EUID的方法 使用类似方法时,如何更改EUID psql -U postgres -c "<command>" > file?

4
问题理解.sh文件中的'hash'命令
所以我想在Linux机器上安装Etherpad lite。如果我尝试运行它,则会收到错误消息: “请安装node.js(http://nodejs.org)” 该命令which node为我提供了通往节点js的正确路径。因此,我进入了Etherpad Lite的.sh文件,发现了这一点: #Is node installed? hash node > /dev/null 2>&1 || { echo "Please install node.js ( http://nodejs.org )" >&2 exit 1 } 我想这意味着:检查节点->如果没有可用的打印行并退出。但是这段代码到底是做什么的?哈希做什么?所有这些&和>什么? 谁能向我解释这三行内容,我们将不胜感激?

2
循环插入Oracle表
要求:在目录中的一台服务器中,存在多个文件。我需要读取文件名并填充到Oracle表中。 我已经写了这样的脚本,但是它不起作用: #!/bin/bash names = find /home/devuser -name 'BI*' sqlplus -s schema_name/passwd << EOF for name in {names[@]} do insert into table1(file_name,status) values('$name','N'); done commit; exit 苦恼DO INVALID IDENTIFIER。

1
向用户重击Bash。最好使用相同或单独的脚本?
我正在研究需要以root身份启动的Linux Bash脚本。在脚本的末尾,它将生成软件包列表。这需要以用户身份运行。然后它将移动软件包,这需要再次以root用户身份运行。我已经设置了sudo,但是想要保持脚本尽可能通用。 我在第一个脚本中尝试了以下内容以及它的一些细微变化,以从根用户切换到用户。 su -c - "$USER" "export PKGDEST=/tmp/test/AUR/" su -c - "$USER" "pacaur --noconfirm --noedit -cm" "$(< /tmp/test/aur)" 第二行无法正常运行,导致不同的错误,具体取决于报价的组合和位置。在读取文件/ tmp / test / aur ::未指定目标之后,如上所示在第一个脚本中运行这些行会产生以下错误(使用-h获得帮助)。我的喜好是使单个脚本方法正常工作。 Google等表示root,用户,bash中的root不好,因此尝试将其分为3部分: 第一个脚本以root身份运行。问题集中在这里,无法启动第二个问题。 第二个脚本以用户身份运行,并以root身份启动第三个脚本:sudo / bin / bash“ $ L” /copyaur.sh 第三个脚本copyaur.sh运行,可以正常移动软件包,但是由于调用了新的shell而没有显示为在终端中运行? 在测试过程中,以下用户终端中以su身份运行。最好在脚本中使用$ USER var。 在终端中以su身份显示,然后返回su - $USER,然后 ls在home中列出我的普通用户名[dom]的内容。 [dom@arch testing]$ echo $USER dom [root@arch …


2
Shell脚本创建一个文件并追加结果
以下脚本将每1小时运行一次。脚本每次运行都会创建一个新文件。 第一个回显将推送报头,而for循环将推送结果。 但是我还想要的是: 头文件每天应该只进入文件一次,并且应该继续将for循环结果附加到同一文件中。 每天应该只创建一个CSV文件。 它应该删除所有名称为result_ something的旧文件。 我有的代码 echo "collectiontime,hostname,diskusage,directory" > /home/result_$CURR_TIME_EPOCH.csv for i in /data01 /opt /opt/splunk /opt/splunk/var/lib/splunk/kvstore /opt/splunk/var/run/searchpeers /opt/splunk/var/run do T=`sudo du -sh $i 2> /dev/null` if [ $? -eq 0 ]; then T=`echo $T | awk '{print $1","$2}'` echo `date +%s`,$HOSTNAME,$T fi done >> /home/result_$CURR_TIME_EPOCH.csv

1
将用户输入读入数组,直到用户输入特定条目
我需要创建一个bash,从用户那里获取输入并将它们插入到数组中,直到用户输入特定内容为止。例如,如果我运行脚本: enter variables: 3 4 7 8 ok 我得到这个数组: array=( 2 4 7 8 ) 要么: enter variables: 15 9 0 24 36 8 1 ok 我得到这个数组: array=( 15 9 0 24 36 8 1 ) 我怎样才能做到这一点?

2
仅抓取准确的文本以输出?
可以说我有这行文字: #cat numbers.txt Numbers!!!! John=55 May=43 RandomData Alex=72 Ben=90 End 但是我只对约翰的电话号码感兴趣。如何删除所有其他我不想要的东西并将输出变成: #cat numbers.txt | <some command line magic> John=55 注意:我不知道“ John”在文本文件中的位置,或分配给John的编号。

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.