انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید

نویسنده موضوع: (bash script) چاپ شدن خروجی دستور بجای ذخیره شدن خروجی در متغیر (حل شد)  (دفعات بازدید: 1536 بار)

0 کاربر و 2 مهمان درحال مشاهده موضوع.

آفلاین Droid

  • Jr. Member
  • *
  • ارسال: 78
  • جنسیت : پسر
میخوام خروجی دستور توی متغیر ذخیره بشه، ولی هم اینکه چاپ میشه (دقیقا تمام مقدار متغیر manifest رو میده بیرون) ، بعد هم که متعیر label رو چاپ میکنم هیچی دیده نمیشه.
label=$(grep -Po "(?<=application: label=')(.+?)(?=')" "$manifest")
این شکلی هم نوشتم، که چیزی چاپ نمیکنه ولی مقدار label مثل بالا خالیه.
label="$( <<EOF
grep -Po "(?<=application: label=')(.+?)(?=')" "$manifest"
EOF
)"

بازم  ](*,)
« آخرین ویرایش: 16 بهمن 1394، 05:37 ب‌ظ توسط Droid »

آفلاین 藤沼

  • Sr. Member
  • *
  • ارسال: 414
  • جنسیت : پسر
محتوای manifest چیه؟ خطی که در اون تعریف شده رو بگذارید.
« آخرین ویرایش: 16 بهمن 1394، 02:38 ب‌ظ توسط b|ackwolf »

آفلاین Droid

  • Jr. Member
  • *
  • ارسال: 78
  • جنسیت : پسر
همونی که توی سوال قبلیم روش regex مینوشتم یعنی لینک

البته بعد نوشتن سوال اینجوری حلش کردم \\:D/ ، در کل میخواستم یه اسکریپت بنویسم که فایلهای apk رو دسته جمعی بر اساس یه سری مقادیر داخل manifest ش تغییر نام بدم که مرتب بشن، به هدفم رسیدم (البته جا برای کامل تر و بهتر کردن داره)، ولی خب دوست دارم اتفاقی که میفتاد رو بدونم.


#!/bin/bash
rename_move() {
    ./aapt debug badging "$1" > temp
    label=$(cat temp | grep -Po "(?<=application: label=')(.+?)(?=')")
    package=$(cat temp | grep -Po "(?<=package: name=')(.+?)(?=')")
    version_code=$(cat temp | grep -Po "(?<=versionCode=')(.+?)(?=')")
    version_name=$(cat temp | grep -Po "(?<=versionName=')(.+?)(?=')")
    mv -f "$1" "$label - $version_name - $version_code - $package.apk"
}

for f in *.apk
do
    rename_move "$f"
done

محتوای manifest چیه؟ خطی که در اون تعریف شده رو بگذارید.

اینجوری مینوشتم:
manifest=$(./aapt debug badging "$1")
label=$(grep -Po "(?<=application: label=')(.+?)(?=')" "$manifest")
« آخرین ویرایش: 16 بهمن 1394، 02:49 ب‌ظ توسط Droid »

آفلاین 藤沼

  • Sr. Member
  • *
  • ارسال: 414
  • جنسیت : پسر
اینجا اشتباه کردی و یک جریان (Stream) رو به‌عنوان فایل به grep دادی:
# wrong
label=$(grep -Po "(?<=application: label=')(.+?)(?=')" "$manifest")
# correct
label=$(echo "$manifest" | grep -Po "(?<=application: label=')(.+?)(?=')")
می‌تونی از نمونهٔ‌ زیر هم استفاده کنی. البته استفاده از این نوع تابع‌ها برای من کلاً اشتباست:
#!/usr/bin/env bash
# filename: manifest.sh

parse() {
    local na="(?<=package: name=')(.+?)(?=')"
    local la="(?<=application: label=')(.+?)(?=')"
    local vc="(?<=versionCode=')(.+?)(?=')"
    local vn="(?<=versionName=')(.+?)(?=')"

    name=$(grep -Po "$na" "$1")
    label=$(grep -Po "$la" "$1")
    version_code=$(grep -Po "$vc" "$1")
    version_name=$(grep -Po "$vn" "$1")
}

rename() {
    mv -f "$1" "$label - $version_name - $version_code - $name.apk"
}

reform() {
    parse "$1"
    rename "$1"
}

find . -iname '*.apk' | while read -r filename; do
    reform "$filename"
done
« آخرین ویرایش: 16 بهمن 1394، 04:52 ب‌ظ توسط b|ackwolf »

آفلاین احسان فعالپور

  • Sr. Member
  • *
  • ارسال: 408
  • جنسیت : پسر
میتونید اینها رو مطالعه کنید:
لینک ۱
لینک ۲
عضو ارشد فدراسیون بیکاران ایران FBI

آفلاین Droid

  • Jr. Member
  • *
  • ارسال: 78
  • جنسیت : پسر
از راهنمایی های هر دو عزیز ممنونم  :)

پی نوشت ندارم
پی لینک