2017-05-05 11 views
1

私はbashで次のコードを実行しようとしています。それは働くと思われますが、そうではありません。 修正できますか?私はプログラミングから始めています。私は数字(10,20..50)を持っているフォルダを反復処理したい、そしてそれがパス・ツー・フォルダ」から、ディレクトリを変更しbashの反復が機能しない

for i in {1:5} 
do 
    cd path-to-folder-number/"$i"0/ 
    echo path-to-folder-number/"$i"0/ 
done 

: コードはこれです-number/10/"〜" path-to-folder-number/20/"..etc

私は次のように置き換えますが、まだ動作していません。スクリプトが適用されたとき、私は得る:アップのために

can't cd to path-to-folder-number/{1..5}0/ 
+3

{1..5}。 echo $ iを実行します。完了しました –

+0

@JohnC私はそれをしましたが、私は得る:path to to-folder-number/{1..5}にcdすることはできません0 /少しスクリプトを変更します、再度投稿を参照してください – santimirandarp

+3

@santimirandarpそれはあなたを示唆bashは使用していませんが、中括弧拡張をサポートしていない他のシェルもあります。スクリプトのシボンラインとは何ですか?あなたはそれをどのように実行していますか? –

答えて

1

ここには3つの問題があると思います。間違ったシェル、範囲の構文が間違っていたり、それらの問題を解決すれば、あなたが望んでいないような連続したcdの問題を抱えているかもしれません。

  • シェルの問題は、あなたがshの代わりbashでスクリプトを実行しているということです。いくつかのシステムでは、shは実際にはbashですが(いくつかの高度な機能は無効になっていますが、POSIX互換モードで動作しています)、あなたのシステムでは、のbash拡張機能のどれもを持たないより基本的なシェルだと思います。

    スクリプトを実行するシェルを制御する最善の方法は、実行するインタープリタを示す「shebang」行を先頭に追加することです。 bashの場合は、#!/bin/bashまたは#!/usr/bin/env bashのいずれかになります。 $ PATHにあるディレクトリにスクリプトを置くか、スクリプトのパスを明示的に指定してスクリプトを実行します(たとえば、同じディレクトリにいる場合は./scriptname)。 で実行しないでください。sh scriptnameで実行してください。これは、シバンを無効にして基本シェルを使用するため動作しません。

    (「shebang」という名前は、行が始まる「#!」文字から始まります - 「#」文字は時々「シャープ」と呼ばれ、「!」は時には「バング」と呼ばれることもありますそれは「シェバング」と略すます「シャープバン」、。)bashで

  • だ、ブレース展開の範囲の正しい構文は{1..5}なく、{1:5}あります。中括弧の拡張はbash拡張であることに注意してください。右のシェルが重要になるのはこのためです。

  • 最後に、問題はあなたが実際にまだに実行していないが、あなたは固定された第一の二つの問題かもしれませんとき:あなたはないcdバックにINGのしているなど、あなたpath-to-folder-number/10/cdをした後、path-to-folder-number/20/間にある元のディレクトリです。したがって、パスとフォルダの番号が相対的な場合(つまり、"/"で始まらない)、それはcdからpath-to-folder-number/10/path-to-folder-number/20/path-to-folder-number/30/path-to-folder-number/40/path-to-folder-number/50/にしようとしています。

    IMO cdをスクリプトで使用すると、間違っている可能性があるため、一般的には悪い考えです。スクリプトがどこにあるのかを把握するのは簡単です。何らかの理由でcdが失敗した場合、残りのスクリプトは間違った場所で実行されます。また、相対パスで指定されたファイルがある場合、元のディレクトリ以外の場所にあるcdの部分が無効になると無効になります。

    明示的なパスを使用してスクリプト内のファイルの場所を参照するだけでははるかに脆弱です。たとえば、cd "path-to-folder-number/${i}0/"; lsの代わりにls "path-to-folder-number/${i}0/"を使用します。

1

は、構文の範囲である:

for i in {1..5} 
do 
    cd path-to-folder-number/"$i"0/ 
    echo $i 
done 

だから、あなたがこれを使用することができますしたい正確に何を取得するには..

+0

私はあなたが正しいと思うが、それは動作していない、**私は得る:パスtoフォルダ番号/ {1..5}にcdすることはできません0 /私は少しスクリプトを変更してください投稿はもう一度 – santimirandarp

1

:を置き換えます。

for i in 10 {20..50} 
do 
    echo $i 
done 
+0

私はOPが10,20,30,40,50を望んでいると思っています... 10,20,21などではなく、49,50まで...つまり{{1..5} 0' – Sundeep

+0

あなたはい、私はそれが変わったと思いますか? – santimirandarp

1

またseq使用することができます:で私用

for i in $(seq 10 10 50); do 
    cd path-to-folder-number/$i/ 
    echo path-to-folder-number/$i/ 
done 
関連する問題