标签: csh

在shell脚本中排序

我有一个阵列

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.11.x.1.

我该怎么做呢 ?

arrays sorting shell csh

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

如何避免在csh中复制路径变量

通常在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)

csh path-variables path environment-variables

9
推荐指数
2
解决办法
8506
查看次数

如何在脚本中使用newgrp,然后在脚本退出时保留在该组中

我在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是必要的.

unix shell solaris csh

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

如何在csh中添加循环计数器到foreach

在CSH foreach循环或for循环中,如何添加循环迭代器或计数器,从10增加到1000,步长为20?

foreach i (1..20..5)或的东西for (i=1;i<20;i++).

foreach counter loops csh

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

java.io.IOException:无法运行程序错误= 2,没有这样的文件或目录

我有一个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 exec

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

将参数从csh传递给程序,就像它们一样

我有一个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,一切都好.但不总是:

  1. foo "a b" "c d":
    我希望bar得到两个论点 - a bc d.相反,它得到4.

  2. foo a "*" b:它*被扩展为文件列表.我只想要这个角色*.
    额外的功劳 - foo a * b应该以同样的方式工作.我知道这更有问题,我愿意没有它.

有一件事我试着在改变./bar $*./bar "$*".这有助于星号,但现在bar总是在一个参数中获取所有内容.

笔记:

  1. 我们公司使用csh作为登录shell,所以我必须在使用时使用它source.知道csh编程被认为是有害的,我实现了所有逻辑bar并在脚本中保留了最低限度.

  2. 如果你建议重新定义别名,重要的是看到重定向仍然有效(foo | grep hello),并且如果ctrl-C破坏了脚本,那么正确清理.

谢谢.

linux csh

9
推荐指数
1
解决办法
8375
查看次数

如何在csh的一行中编写foreach?

有时我在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).我该怎么做?

shell foreach csh

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

在csh中重定向stderr

我正在执行一个将崩溃报告转储到STDERR我必须过滤一些必要信息的程序.问题是,我无法重定向STDERRSTDOUTPIPEgrep

command 2>&1 >/dev/null | grep "^[^-]" >& /tmp/fl
Run Code Online (Sandbox Code Playgroud)

得到错误: Ambiguous output redirect.

相同的命令在bash终端下工作.我应该改变什么来使它工作?

linux shell csh tcsh

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

附加到csh中可能尚不存在的环境变量的简单方法

我试图在我的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)

csh environment-variables login-script parameter-expansion

9
推荐指数
1
解决办法
2194
查看次数

如何从csh脚本重定向stdout和stderr

对于以下脚本

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和输出而不要求用户进行重定向?

redirect csh

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