我有一个阵列
arr=( x11 y12 x21 y22 x31 y32)
Run Code Online (Sandbox Code Playgroud)
我需要将此数组排序为
x11 x21 x31 y12 y22 y32
Run Code Online (Sandbox Code Playgroud)
所以,我需要按字母和数字排序
我如何在shell脚本中执行此操作?
如果我使用[ $i -le $j ],它会说"预期的整数表达式".
字符串也可能包含其他字符:x.1.1或1.x.1.
我该怎么做呢 ?
通常在cshrc文件中有类似的东西来设置路径:
set path = ( . $otherpath $path )
Run Code Online (Sandbox Code Playgroud)
但是,当您多次获取cshrc文件时,路径会重复,您如何防止重复?
编辑:这是一种不干净的方式:
set localpaths = ( . $otherpaths )
echo ${path} | egrep -i "$localpaths" >& /dev/null
if ($status != 0) then
set path = ( . $otherpaths $path )
endif
Run Code Online (Sandbox Code Playgroud) 我在solaris Box上运行脚本.特别是SunOS 5.7.我不是根.我正在尝试执行类似于以下内容的脚本:
newgrp
thegroup << FOO source .login_stuff
echo"hello world"
FOO
脚本运行.问题是它返回到调用进程,该进程将我放入源组.login_stuff未被获取的旧组中.我理解这种行为.我正在寻找的是一种留在子壳中的方法.现在我知道我可以在脚本中放一个xterm&(见下文)并且会这样做,但是有一个新的xterm是不可取的.
将当前pid作为参数传递.
newgrp
thegroup << FOO source .login_stuff
xterm&
echo $ 1
kill -9 $ 1
FOO
我没有可用的sg.此外,newgrp是必要的.
在CSH foreach循环或for循环中,如何添加循环迭代器或计数器,从10增加到1000,步长为20?
像foreach i (1..20..5)或的东西for (i=1;i<20;i++).
我有一个java类,我在其中调用runhellscript方法来执行脚本.它与mysql一起工作得很好,但我似乎无法找出为什么它不能与psql很好地工作.这是我的runhell方法的摘录:
public class RunShellScript {
public static void runShellScript (String unixCommand)
{
try {
Runtime runtime=Runtime.getRuntime();
//Process process=runtime.exec(new String [] { "/bin/csh", "-c", unixCommand});
Process process=runtime.exec(new String [] {unixCommand});
InputStream stderr=process.getErrorStream();
InputStreamReader isr=new InputStreamReader (stderr);
BufferedReader br=new BufferedReader (isr);
String line=null;
System.out.println("<ERROR>");
while((line=br.readLine())!=null)
System.out.println(line);
System.out.println(line);
int exitVal=process.waitFor();
System.out.println("Process exitValue:" + exitVal);
}
catch (Throwable t)
{
t.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
问题是,当我把它放在鼠标点击事件后面时,它说命令未找到.这是代码beuind the mous事件
private void jMenuItem13MousePressed(java.awt.event.MouseEvent evt) {
String shellCommand="vobs/tools/Scripts/DataValidation/mysqlconnection.csh";
RunShellScript.runShellScript(shellCommand);
// TODO add your handling code here:
}
Run Code Online (Sandbox Code Playgroud)
奇怪的是,当我直接进入脚本所在的目录并输入./mysqlconnection时,脚本可以工作.但是,当我只是键入mysqlconnection时,说找不到命令.不知怎的,它没有将我的脚本名称识别为命令?
我有一个csh脚本,使用"source"执行,并将其所有参数传递给程序:
% alias foo source foo.csh
% cat foo.csh
./bar $*
# Some uninteresting stuff
Run Code Online (Sandbox Code Playgroud)
如果我跑source foo.csh a b c,一切都好.但不总是:
foo "a b" "c d":
我希望bar得到两个论点 - a b和c d.相反,它得到4.
foo a "*" b:它*被扩展为文件列表.我只想要这个角色*.
额外的功劳 - foo a * b应该以同样的方式工作.我知道这更有问题,我愿意没有它.
有一件事我试着在改变./bar $*到./bar "$*".这有助于星号,但现在bar总是在一个参数中获取所有内容.
笔记:
我们公司使用csh作为登录shell,所以我必须在使用时使用它source.知道csh编程被认为是有害的,我实现了所有逻辑bar并在脚本中保留了最低限度.
如果你建议重新定义别名,重要的是看到重定向仍然有效(foo | grep hello),并且如果ctrl-C破坏了脚本,那么正确清理.
谢谢.
有时我在csh中对不同的目标文件使用相同的foreach操作.
如果我可以在一行中给出foreach命令,我可以轻松地替换目标文件名来重复该过程.(我通常使用`find.-name ...`来表示目标文件)
为了这个问题的目的,让我们假设我想要捕获所有*.txt文件.
$ foreach i (*.txt)
foreach? cat $i
foreach? end
Run Code Online (Sandbox Code Playgroud)
我阅读https://unix.stackexchange.com/questions/32873/running-a-full-foreach-command并试过
alias disp 'echo "foreach i (*.txt)"; echo "cat "\$"i"; echo "end"; | /bin/csh'
Run Code Online (Sandbox Code Playgroud)
当我输入disp它给我Invalid null command.
如果我可以在一行中完成,我可以做!foreach:gs/\.c\>/.h/(用.h替换.c).我该怎么做?
我正在执行一个将崩溃报告转储到STDERR我必须过滤一些必要信息的程序.问题是,我无法重定向STDERR到STDOUT与PIPE它grep
command 2>&1 >/dev/null | grep "^[^-]" >& /tmp/fl
Run Code Online (Sandbox Code Playgroud)
得到错误: Ambiguous output redirect.
相同的命令在bash终端下工作.我应该改变什么来使它工作?
我试图在我的PERL5LIB环境变量的末尾附加一个路径,但我不确定这个变量是否总是存在.如果它不存在,我想简单地将它初始化为我试图追加的值.
这是一个有效的例子:
if ( $?PERL5LIB ) then
setenv PERL5LIB ${PERL5LIB}:/some/other/path
else
setenv PERL5LIB /some/other/path
endif
Run Code Online (Sandbox Code Playgroud)
虽然这有效,但它仍然看起来很笨重,因为我必须基本上写两次同一行.我想做的是提出一个更有效的单线解决方案(可能使用参数扩展).
有没有办法将其合并为一条线?(或者多行不涉及多次写出"/ some/other/path")
例如,这可以在bash中完成:
export PERL5LIB=${PERL5LIB:+${PERL5LIB}:}/some/other/path
Run Code Online (Sandbox Code Playgroud) 对于以下脚本
install.csh:
#!/bin/csh -f tar -zxf Python-3.1.1.tgz cd Python-3.1.1 ./configure make make install cd .. rm -rf Python-3.1.1
有可能的使用:
./install.csh |& tee install.log
Run Code Online (Sandbox Code Playgroud)
如何更改脚本以便我仍然在控制台上获得install.log和输出而不要求用户进行重定向?