0

Linux 用のスクリプトを WD ワールド エディション ドライブに適合させようとしています。

スクリプトは Bash (debian) 用に書かれていますが、私の WD は busybox (ash を使用) のみを実行します。それにもかかわらず、Google を使用するだけでほとんどの機能を利用できます。私が対応するものを見つけていない唯一の演算子は、 =~ 演算子です。

=~ 演算子の機能を古いスクリプトから ash に移植するにはどうすればよいですか?

脚本:

#! /bin/bash
# posttorrent.sh by Killemov
{
  # Log file, file where we tell what events have been processed.
  LOG_FILE=/var/log/posttorrent.log
  # Username for transmission remote.
  TR_USERNAME="username"
  # Password for transmission remote.
  TR_PASSWORD="password"
  # Get current time.
  NOW=$(date +%Y-%m-%d\ %H:%M:%S)
  # Source directory, should not be changed.
  SRC_DIR="${TR_TORRENT_DIR}/${TR_TORRENT_NAME}"
  # Directory to store the un-compressed files in..
  DEST_DIR="${TR_TORRENT_DIR}/${TR_TORRENT_NAME}/"
  # This parameter string could be passed from Transmission in the future.
  TR_TORRENT_PARAMETER="EXTRACT SLEEP1h"

echo "text"
  if [ -e "$SRC_DIR/keep" ]; then
    TR_TORRENT_PARAMETER="$TR_TORRENT_PARAMETER KEEP"
  fi

  if [ -e "$SRC_DIR/exit" ]; then
    TR_TORRENT_PARAMETER="EXIT"
  fi

  # Actual processing starts here.
  if [[ "$TR_TORRENT_PARAMETER" =~ "EXIT" ]]; then
    echo $NOW "Exiting $TR_TORRENT_NAME" >> $LOG_FILE
    exit 0
  fi
echo "text2"
  if [[ "$TR_TORRENT_PARAMETER" =~ "EXTRACT" ]]; then
    cd $TR_TORRENT_DIR
    if [ -d "$SRC_DIR" ]; then
      IFS=$'\n'
      unset RAR_FILES i
      for RAR_FILE in $( find "$SRC_DIR" -iname "*.rar" ); do
        if [[ $RAR_FILE =~ .*part.*.rar ]]; then
          if [[ $RAR_FILE =~ .*part0*1.rar ]]; then
            RAR_FILES[i++]=$RAR_FILE
          fi
        else
          RAR_FILES[i++]=$RAR_FILE
        fi
      done
      unset IFS

      if [ ${#RAR_FILES} -gt 0 ]; then
        for RAR_FILE in "$(eval \$$RAR_FILES[@])"; do
          unrar x -inul "$RAR_FILE" "$DEST_DIR"
          if [ $? -gt 0 ]; then
            echo $NOW "Error unrarring $TR_TORRENT_NAME" >> $LOG_FILE
            transmission-remote -n $TR_USERNAME:$TR_PASSWORD -t$TR_TORRENT_ID --verify --start
            exit 0
          fi
        done
        if [[ ! "$TR_TORRENT_PARAMETER" =~ "KEEP" ]]; then
          SLEEP=$(expr match "$TR_TORRENT_PARAMETER" '.*SLEEP\([0-9a-zA-Z]*\)')
          if [ ${#SLEEP} -gt 0 ]; then
            sleep $SLEEP
          fi
          transmission-remote -n $TR_USERNAME:$TR_PASSWORD -t$TR_TORRENT_ID --remove-and-delete
        fi
        echo $NOW "Unrarred $TR_TORRENT_NAME" >> $LOG_FILE
      fi
    fi
  fi
} &

(間接参照に問題がありました。正しく修正されたことを願っています)

4

1 に答える 1

0

さて、$VARIABLE =~ PATERNあなたは以下を使用できるはずです:

echo "$VARIABLE" | grep -E PATTERN

しかし、算術式にも少し問題があると思います。i++実装されている場合は構文を使用する必要があり、i=$(($i + 1))実装されていない場合は構文を使用する必要がありi=$(expr $i + 1)ます。

IFS=$'\n' の理由は検索を改行で分割するためだと思いますが、検索を一時ファイルに発行してから、 , を実行する方がよいでしょうwhile read line; do ... done <$tmpfile

さらに、busybox ash のすべてのバージョンが配列をサポートしているかどうかは定かではないため、そこでも問題が発生する可能性があります。

于 2012-04-29T16:21:44.593 に答える