标签: shell-scripting

使用外部文件中的变量控制 bash 脚本

我想控制这样的 bash 脚本:

#!/bin/sh
USER1=_parsefromfile_
HOST1=_parsefromfile_
PW1=_parsefromfile_
USER2=_parsefromfile_
HOST2=_parsefromfile_
PW2=_parsefromfile_

imapsync \
--buffersize 8192000 --nosyncacls --subscribe --syncinternaldates --IgnoreSizeErrors \
--host1 $HOST1 --user1 $USER1 --password1 $PW1 --ssl1 --port1 993 --noauthmd5 \
--host2 $HOST2 --user2 $USER2 --password2 $PW2 --ssl2 --port2 993 --noauthmd5 --allowsizemismatch
Run Code Online (Sandbox Code Playgroud)

使用来自控制文件的参数,如下所示:

host1 user1 password1 host2 user2 password2
anotherhost1 anotheruser1 anotherpassword1 anotherhost2 anotheruser2 anotherpassword2 
Run Code Online (Sandbox Code Playgroud)

其中每一行代表脚本的一次运行,其中提取了参数并制成变量。

这样做的最优雅的方式是什么?

shell bash shell-scripting

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

从 shell 脚本中,如何检查 MySQL 数据库中的表是否存在?

我正在尝试编写一个脚本,该脚本允许用户选择他需要对表格进行的操作。我想检查表是否存在。如果它存在,我将继续其他事情,否则我退出说表不存在。我怎么可能做到这一点。

mysql shell shell-scripting

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

如何在centos系统启动时自动运行脚本

我已经成功安装了 TeamCity ib CentOS 6.2 Minimal。我一直在尝试在系统启动时自动运行脚本:

/opt/TeamCity/bin/teamcity-server.sh start
Run Code Online (Sandbox Code Playgroud)

我用谷歌搜索并尝试了各种方法,但似乎都失败了。大多数方法都指向将启动脚本添加到 rc.local 文件之一:

/etc/rc.d/rc.local
/etc/rc.local
Run Code Online (Sandbox Code Playgroud)

并且 rc.local 的内容包含以下行:

/opt/TeamCity/bin/teamcity-server.sh start
Run Code Online (Sandbox Code Playgroud)

没有一个会启动teamcity服务器

如果我手动运行脚本没有问题。

看起来很简单,但如何让 shell 脚本自动运行?

teamcity shell-scripting centos6

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

从任何地方运行脚本

我有一个脚本:

#!/bin/bash
echo "$(dirname $(readlink -e $1))/$(basename $1)"
Run Code Online (Sandbox Code Playgroud)

位于此处:/home/myuser/bin/abspath.sh具有执行权限。

如果我运行,echo $PATH我会得到以下信息:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/myuser/bin

我希望能够从任何目录调用abspath <some_path_here>并调用我的脚本。我正在使用 bash,我做错了什么?

linux shell shell-scripting

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

如何使用 shell 脚本从 docker hub 删除超过 x 天的 docker 镜像

如何使用 shell 脚本从 docker hub 删除 docker 镜像。

我想从 docker hub 中删除私人 docker hub 帐户过去 50 天之前的所有映像。

有任何想法吗?通过 Jenkins 或 bash 终端创建和运行此 shell 脚本时要使用哪些工具。

我正在考虑使用curl来实现我的目标。

shell-scripting docker-registry

8
推荐指数
1
解决办法
4818
查看次数

使用临时文件与管道的优缺点

假设我有一个名为 jobs.csv 的文件,我希望由 Foo 完成前 50k 项工作

我可以这样做:

# cat jobs.csv | sort -u | head -n 50000 > /tmp/jobs.csv
# cat /tmp/jobs.csv | while read line; do Foo --job=$line; done
Run Code Online (Sandbox Code Playgroud)

或者

# cat jobs.csv | sort -u | head -n 50000 | while read line; do Foo --job=$line; done 
Run Code Online (Sandbox Code Playgroud)

在系统的 IO/内存效率方面,谁能说出哪个更好?

或者更好的是,可以为此提出更好的解决方案吗?

unix io pipe shell-scripting

7
推荐指数
1
解决办法
2892
查看次数

“监视”命令来通知 linux 上新创建的文件

watch 命令通知 linux 上新创建的文件

如何修改以下命令以通知 linux 用户 john 创建新文件到 /usr/local/mydir/ ?

watch -d 'ls -l /usr/local/mydir/ | fgrep john'
Run Code Online (Sandbox Code Playgroud)

即,如果在 /usr/local/mydir/ 中创建了任何新文件,我想持续监视并调用另一个脚本。

在生产中,我不能使用任何工具而不是 shell 脚本。那么可以帮助我使用 shell 脚本解决方案吗?

shell-scripting

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

期望脚本 + 期望错过发送字符串 + 延迟问题

我编写了 active.ksh 脚本(基于expect),以便自动登录到某些 Solaris 机器并执行主机名命令(登录到虚拟 IP 以验证哪个主机名是活动机器 - 我有两个集群 solaris 机器)

问题在于expect; 期望发送密码字符串 (pass123) 并且它错过了密码问题,它仍然等待密码。

所以实际上密码(pass123)是在密码问题之后输入的。在大多数情况下,expect 脚本工作正常,但有时会错过密码。

问题示例

 ./active.ksh
 spawn ssh 10.10.18.61
 sh: /usr/local/bin/stty: not found
 This computer system, including all related equipment, networks and network devices      (specifically including Internet access),is provided only for authorized uss
 Password:        * my remark - pass123 string was missed the Password Question        pass123
 Password: 
Run Code Online (Sandbox Code Playgroud)

剧本

  #!/bin/ksh

  VIP_ADDRESS=10.10.18.61


  expect_for_verify_which_active_machine=`cat << EOF
  set timeout -1
  spawn  ssh   $VIP_ADDRESS 
  expect {
  ")?"   { send "yes\r" …
Run Code Online (Sandbox Code Playgroud)

linux solaris ssh expect shell-scripting

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

遍历服务器并运行命令

我在名为network_list.txt. 如何运行服务器并运行命令并显示结果?我尝试了以下方法:

filename="network_list.txt"
service=httpd
while read -r line
do
    name="$line"
    ping -c 3 $name > /dev/null 2>&1;
    RETVAL=$?
        if [ $RETVAL -ne 0 ]
        then 
           echo "$name is down"
        else 
            echo "$name is up and running"
        fi
    http_status=$(ssh $name ps -ef | grep -v grep | grep $service | wc -l)
        if [ $http_status -ne 0 ]
        then
            echo "$service is up and running in $name"
        else
            echo "$service is down in $name"
        fi
done < "$filename"
Run Code Online (Sandbox Code Playgroud)

但它在第一台服务器后停止。 …

ssh service shell-scripting

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

使用 Find 返回引用的文件路径列表

我想创建一个 tarball,其中包含ctime小于 30 天的目录中的文件。我发现的大多数教程基本上都推荐做这样的事情:

tar cvf foo.tar $(find ~/POD -type f -ctime -30)
Run Code Online (Sandbox Code Playgroud)

问题是我想压缩的很多文件的名称中都包含空格。这意味着该tar命令将基于空格分隔,这意味着完整的文件路径将被分解。

所以现在我试图让find命令返回一个带引号的文件路径列表。所以这是我尝试过的:

find . -type f -ctime -30  | xargs printf "\"%s\"\n"
Run Code Online (Sandbox Code Playgroud)

但是这个命令也把所有基于空格的文件名分解了。然后我尝试了这个:

oldifs=$IFS
IFS=\n
find . -type f -ctime -30  | xargs printf "\"%s\"\n"
IFS=$oldifs
Run Code Online (Sandbox Code Playgroud)

但这给了我相同的结果。

有没有办法可以将完整路径名传递给tar并让所有内容都使用名称中的空格?

linux unix tar shell-scripting

6
推荐指数
1
解决办法
210
查看次数

标签 统计

shell-scripting ×10

linux ×3

shell ×3

ssh ×2

unix ×2

bash ×1

centos6 ×1

docker-registry ×1

expect ×1

io ×1

mysql ×1

pipe ×1

service ×1

solaris ×1

tar ×1

teamcity ×1