我想存储一个命令,以便稍后在变量中使用(不是命令的输出,而是命令本身)
我有一个简单的脚本如下:
command="ls";
echo "Command: $command"; #Output is: Command: ls
b=`$command`;
echo $b; #Output is: public_html REV test... (command worked successfully)
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试更复杂的东西时,它会失败.例如,如果我做
command="ls | grep -c '^'";
Run Code Online (Sandbox Code Playgroud)
输出是:
Command: ls | grep -c '^'
ls: cannot access |: No such file or directory
ls: cannot access grep: No such file or directory
ls: cannot access '^': No such file or directory
Run Code Online (Sandbox Code Playgroud)
知道如何在变量中存储这样的命令(使用管道/多个命令)供以后使用吗?
以下是一系列echo $var可以显示与刚刚分配的值不同的值的情况.无论指定的值是"双引号","单引号"还是不引用,都会发生这种情况.
如何让shell正确设置我的变量?
星号
预期的输出是/* Foobar is free software */,但我得到一个文件名列表:
$ var="/* Foobar is free software */"
$ echo $var
/bin /boot /dev /etc /home /initrd.img /lib /lib64 /media /mnt /opt /proc ...
Run Code Online (Sandbox Code Playgroud)
方括号
期望值是[a-z],但有时我会得到一个字母!
$ var=[a-z]
$ echo $var
c
Run Code Online (Sandbox Code Playgroud)
换行(换行符)
预期值是一个单独的行列表,但所有值都在一行!
$ cat file
foo
bar
baz
$ var=$(cat file)
$ echo $var
foo bar baz
Run Code Online (Sandbox Code Playgroud)
多个空间
我期望一个精心对齐的表头,但是多个空格要么消失要么折叠成一个!
$ var=" title | count"
$ echo $var
title | count
Run Code Online (Sandbox Code Playgroud)
标签
我期望两个制表符分隔值,但我得到两个空格分隔值!
$ …Run Code Online (Sandbox Code Playgroud) 当我尝试运行时Runtime.exec(String),某些命令可以正常工作,而其他命令则执行但是失败或做的事情与终端不同.这是一个独立的测试用例,演示了这种效果:
public class ExecTest {
static void exec(String cmd) throws Exception {
Process p = Runtime.getRuntime().exec(cmd);
int i;
while( (i=p.getInputStream().read()) != -1) {
System.out.write(i);
}
while( (i=p.getErrorStream().read()) != -1) {
System.err.write(i);
}
}
public static void main(String[] args) throws Exception {
System.out.print("Runtime.exec: ");
String cmd = new java.util.Scanner(System.in).nextLine();
exec(cmd);
}
}
Run Code Online (Sandbox Code Playgroud)
如果我用命令替换命令,该示例效果很好echo hello world,但对于其他命令 - 尤其是那些涉及带有空格的文件名 - 我即使命令明确执行也会出错:
myshell$ javac ExecTest.java && java ExecTest
Runtime.exec: ls -l 'My File.txt'
ls: cannot access 'My: No such file …Run Code Online (Sandbox Code Playgroud) 如何禁止shell命令的错误消息?
例如,如果jpg目录中只有文件,则运行ls *.zip会显示错误消息:
$ ls *.zip
ls: cannot access '*.zip': No such file or directory
Run Code Online (Sandbox Code Playgroud)
有没有选项可以抑制此类错误消息?我想在bash脚本中使用此命令,但我想隐藏所有错误.
我有一行代码可以在我的终端中正常工作:
for i in *.mp4; do echo ffmpeg -i "$i" "${i/.mp4/.mp3}"; done
Run Code Online (Sandbox Code Playgroud)
然后我在脚本中放入完全相同的代码行myscript.sh:
#!/bin/sh
for i in *.mp4; do echo ffmpeg -i "$i" "${i/.mp4/.mp3}"; done
Run Code Online (Sandbox Code Playgroud)
但是,现在运行时出现错误:
$ sh myscript.sh
myscript.sh: 2: myscript.sh: Bad substitution
Run Code Online (Sandbox Code Playgroud)
基于其他问题,我尝试将shebang更改为#!/bin/bash,但我得到完全相同的错误.为什么我不能运行这个脚本?
我只是想知道如何在单引号内回显变量(我使用单引号,因为字符串中有引号).
echo 'test text "here_is_some_test_text_$counter" "output"' >> ${FILE}
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激
我正在尝试编写一个notify-finish可以添加到任何命令之前的脚本.完成后,它将运行以下参数给出的命令,然后在命令完成时通过电子邮件发送给用户.这就是我所拥有的:
PROG=$1
# Run command given by arguments
$@
ECODE=$?
echo -e "Subject: `hostname`: $PROG finished\r\nTo: <$USER>\r\n\r\nExited with $ECODE\r\n" | sendmail $USER
Run Code Online (Sandbox Code Playgroud)
这在大多数情况下都有效,但是当参数包含空格时,引用会被删除.
工作范例:
notify-finished rsync -avz source/ user@remote:dest/
Run Code Online (Sandbox Code Playgroud)
失败的例子:
notify-finished rsync -avz -e 'ssh -c blowfish' source/ user@remote:dest/
Run Code Online (Sandbox Code Playgroud)
在第二种情况下,$@扩展到rsync -avz -e ssh -c blowfish source user@remote:dest/,缺少单引号.它也不适用于双引号,也不适用于$*.
在阅读其他帖子之后,我尝试将命令放在一个数组中,但是我得到了完全相同的问题:
CMD=(notify-finished rsync -avz -e 'ssh -c blowfish' source/ user@remote:dest/)
${CMD[@]}
Run Code Online (Sandbox Code Playgroud)
我如何使这项工作适用于所有论点?
我是Bash脚本的新手,这对我来说很困惑.我正在为项目添加ASCII艺术,似乎无法弄清楚如何逃避某些字符.有人请帮助我下面的代码工作吗?
每当我尝试添加斜杠作为转义字符来修复错误时,斜杠也会在执行时打印到控制台.这破坏了形象.我不明白我做错了什么,所以我发布了下面的代码,希望有人花一点时间向我展示正确的方法.请?我删除了引号以防止更混乱.
echo -en "\E[31m"
echo
echo _,.
echo ,` -.)
echo '( _/'-\\-.
echo /,|`--._,-^| ,
echo \_| |`-._/|| ,'|
echo | `-, / | / /
echo | || | / /
echo `r-._||/ __ / /
echo __,-<_ )`-/ `./ /
echo ' \ `---' \ / /
echo | |./ /
echo / // /
echo \_/' \ |/ /
echo | | _,^-'/ /
echo | , `` (\/ /_
echo \,.->._ \X-=/^
echo ( …Run Code Online (Sandbox Code Playgroud) 我必须监控X11剪贴板.
目前,我每隔5秒请求ClipBoard选择,然后我对从剪贴板返回的文本进行哈希处理,并将其与上次检查中的哈希计算进行比较.如果哈希不一样,我分析文本内容并做一些事情......
我不喜欢我的方法.我来自Windows,并且使用winapi,当剪贴板发生变化时,内核会通知您的程序,并且效率更高!
我只想知道当剪贴板发生变化时,X11是否可以将您的程序通知为winapi?使用X11检查剪贴板修改的更有效方法是什么?
我有两个java类如下:
1.
class App1 {
public static void main(String[] args) {
System.out.println("App1 hello world...");
}
}
Run Code Online (Sandbox Code Playgroud)
2.
package java.java.package1;
class App2 {
public static void main(String[] args) {
System.out.println("App2 hello world...");
}
}
Run Code Online (Sandbox Code Playgroud)
然后,我编译并运行它们,结果如下:
D:\javaTest>javac App1.java
D:\javaTest>javac App2.java
Run Code Online (Sandbox Code Playgroud)
那么如何运行App2类呢?