我想用给定远程主机的 IP 地址设置一个环境变量。这是我到达的解决方案:
export IP=`curl http://network-tools.com/default.asp?host=www.example.com |
grep -oE '<br>[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' |
cut -c5-`
Run Code Online (Sandbox Code Playgroud)
它工作正常,但我有几个问题:
我使用的脚本根据系统 %username% 为 AS400 会话生成会话名称,问题是如果用户名长度超过 7 个字符,连接将失败。会话名称附加一个字符,连接支持的总长度为 8 个字符。
有任何想法吗?
我不知道如何在字符串(例如“user1”)前加上波浪号(~)来生成~user1并将其扩展到 user1 的主目录。
这是我现在所拥有的:
USER="user1"
ls ~${USER}
ls: cannot access ~user1: No such file or directory
Run Code Online (Sandbox Code Playgroud)
~user1没有被扩展。我怎样才能实现它?
这不起作用:
$ cat test.sh
USER="user1"
ls $(~$USER)
$ sh -x test.sh
+ USER=user1
+ ~user1
test.sh: 1: ~user1: not found
+ ls
test.sh
Run Code Online (Sandbox Code Playgroud) 假设我有一个 10MB 的文本文件foo.txt,它有 100,000 行。现在,我想foo.txt逐个窗口处理,窗口大小为 10。
我目前的脚本是这样的:
for ((i=0;i<$lines;i=i+$step))
do
head -$((i+step)) $1 | tail -$step > tmp1
head -$((i+step)) $2 | tail -$step > tmp2
setstr=$setstr' '`./accuracy.sh tmp1 tmp2`
done
echo $setstr | awk '{for (i=1;i<=NF;i++) sum+=$i; }END{print sum/NF}'
Run Code Online (Sandbox Code Playgroud)
但它运行缓慢。有什么简单有效的方法可以做到这一点吗?
有没有办法在另一个用户的权限下(自动)执行 bash 脚本?我认为“sudo”是正确的方法,但我不知道如何自动化该过程。
例如,我想运行这样的程序(用户“bla”在“blub”下运行一个进程):
sudo <the user under which i want to run the process> <path to script>
Run Code Online (Sandbox Code Playgroud) 我有一个服务的新贵配置,需要检查它启动时进程的存在。这听起来很容易,但我已经尝试了 3 个小时来解决这个问题,但我迷路了。问题似乎是一些 grep 语句导致 upstart 中的脚本退出,导致启动服务失败。但是 upstart 不记录任何内容,它只是退出脚本并消失了。
以下是触发问题的一些示例行:记录第一个回声及其 grep 的输出,记录第二个回声,但不记录其 grep 的输出。在第二个 echo upstart 之后,退出脚本并停止。问题是添加 -v 选项或其他类似使用 [[:digit:]] 之类的正则表达式类的选项。似乎我需要转义一些字符,但我根本不知道如何转义。一个简单的 -v 或类似的东西不起作用。
script
echo grep
ps ax | grep "postgres: wal writer process" | grep "grep"
echo grep2
ps ax | grep "postgres: wal writer process" | grep -v "grep"
end script
Run Code Online (Sandbox Code Playgroud)
有没有人知道我做错了什么以及如何解决问题?
我对 Linux 脚本比较陌生,当目录名或文件名中有空格时,我尝试使用的脚本有问题。该脚本会缩小 PDF 文件,以便我可以将它们放入电子邮件中。
gs -q -dNOPAUSE -dBATCH -dSAFER \
-sDEVICE=pdfwrite \
-dCompatibilityLevel=1.3 \
-dPDFSETTINGS=/screen \
-dEmbedAllFonts=true \
-dSubsetFonts=true \
-dColorImageDownsampleType=/Bicubic \
-dColorImageResolution=72 \
-dGrayImageDownsampleType=/Bicubic \
-dGrayImageResolution=72 \
-dMonoImageDownsampleType=/Bicubic \
-dMonoImageResolution=72 \
-sOutputFile=Compressed$1 \
"$1"
Run Code Online (Sandbox Code Playgroud)
所以我使用命令
find * -type f -name "*.pdf" -exec sudo sh ~/shrinkpdf.sh {} \;
Run Code Online (Sandbox Code Playgroud)
它将在没有空格的同一文件夹中处理 PDF,但是当它尝试访问其中有空格的文件夹时,它会出错并仅使用文件夹名称的第一个单词创建一个文件。
我怎样才能让它接受名称中带有空格的文件和文件夹?
感谢 Shell Script Challenged 的用户,
一个简单的任务:给定一个文件目录和一个将一个文件作为输入并生成一个文件作为输出的命令,我想一次处理一个目录中的所有文件,并用相应的匹配名称(带有新的扩展名)输出它们。
所以如果命令通常是:
convert -input sourceFile.ext -output destFile.out
Run Code Online (Sandbox Code Playgroud)
我想处理一个文件夹
file1.ext, file2.ext, etc.
Run Code Online (Sandbox Code Playgroud)
并在相同的目录中生成文件
file1.out, file2.out, etc.
Run Code Online (Sandbox Code Playgroud)
有没有办法在终端中做到这一点而无需编写 bash 脚本?我对脚本不是很熟悉,所以任何简单的解决方案都将不胜感激。
我在 Windows 服务器上,我正在寻找一种方法来在 Linux 服务器上远程运行一些脚本(通过 RSH?)。
问题是,每当我想测试某些东西并且我想自动化它时,我都必须在不同的服务器上手动做很多事情,同时也减少它的出错率。
有没有办法做到这一点?
目前我刚刚使用 Putty 登录到 SSH 终端并在 Linux 服务器上本地运行脚本。
我有一个批处理脚本,我基本上希望它向用户显示一个记事本窗口,其中打开了一个配置文件,供用户在每次运行脚本时进行编辑,并且我希望命令提示符等到该程序关闭才能继续执行,并运行使用该配置文件的程序。
我想这样做是因为我不想使用“set /P”命令样式在批处理脚本中获取用户输入,并且必须设置解析读取和写入到有许多值要检查的配置文件。
我相信在 Windows 上执行任何可执行程序时的标准行为是“exe”文件,它将在自己的进程中打开程序并立即控制回到脚本/命令提示符。对于“bat”和“cmd”脚本文件,它将执行脚本并等待直到控制权返回到第一个脚本或命令提示符。这应该是至少使用“CALL”命令调用另一个脚本或直接调用它时的行为。
现在在 Linux 上,我相信可执行内容的默认行为是可以没有扩展名的本机机器代码和“sh”文件之类的脚本,以阻塞方式执行,除非您指定与号(“&”)字符在输入线上的某个地方。
所以我试图在 Windows 上实现阻塞行为,因为它在 Linux 上更容易实现,并且希望关闭程序以触发原始脚本继续,或者将控制权返回到命令提示符。
script ×10
bash ×5
linux ×5
shell ×3
batch ×2
windows ×2
command-line ×1
escaping ×1
file-io ×1
networking ×1
privileges ×1
remote ×1
sudo ×1
upstart ×1
windows-7 ×1