শেল স্ক্রিপ্ট যদি কোনও ফাইল তৈরি না করে থাকে?


20

আমার একটি শেল স্ক্রিপ্ট তৈরি করা দরকার যা কোনও ফাইলের উপস্থিতি যাচাই করে এবং এটি উপস্থিত না থাকলে এটি তৈরি করে এবং পরবর্তী কমান্ডে চলে যায়, বা কেবল পরবর্তী কমান্ডে চলে যায়। আমার যা আছে তা তা করে না।

#!/bin/bash

# Check for the file that gets created when the script successfully finishes.
if [! -f /Scripts/file.txt]
then
: # Do nothing. Go to the next step?
else
mkdir /Scripts # file.txt will come at the end of the script
fi

# Next command (macOS preference setting)
defaults write ...

রিটার্ন হয়

line 5: [!: command not found
mkdir: /Scripts: File exists

কি করব ভাবনা নেই। একটি গুগল অনুসন্ধান আমাকে যে জায়গাগুলি নিয়ে আসে তা প্রতিটি জায়গাই আলাদা কিছু নির্দেশ করে।


6
আপনার কোডটি শেলচেক.নেটে রাখুন এবং এতে করা পরামর্শগুলি পর্যালোচনা করুন
রোয়াইমা

12
কোনও কারণ আপনি কেবল touchফাইল এবং শর্তসাপ ছেড়ে যেতে পারবেন না ?
কির্কপ্যাট

নীচের অন্যান্য উত্তরগুলি সিনট্যাক্স ত্রুটি ( [এবং এর মধ্যে স্থানটি অনুপস্থিত !) হিসাবে চিহ্নিত করেছে, তবে এটি সম্ভবত এখানে [ইউনিক্সের প্রকৃত আদেশ হিসাবে উল্লেখ করা সহায়ক । একটি ইউনিক্স কমান্ডের জন্য কমান্ডের নাম এবং এটির যুক্তিগুলির মধ্যে কিছু শ্বেত স্থান প্রয়োজন। হ্যাঁ, এটি একটি বাশ অন্তর্নির্মিত , তবে /usr/bin/[বেশিরভাগ সিস্টেমে বাইনারিও রয়েছে ।
TheDudeAbides

উত্তর:


44

সম্ভবত সহজ সমাধান, সুস্পষ্ট পরীক্ষা করার দরকার নেই, কেবল ব্যবহার করুন:

mkdir -p /Scripts
touch /Scripts/file.txt

আপনি যদি একটি বিদ্যমান এর "পরিবর্তনের" সময় না চান তাহলে file.txtদ্বারা পরিবর্তন করা touch, আপনি ব্যবহার করতে পারেন touch -a /Scripts/file.txtকরতে touchশুধুমাত্র "অ্যাক্সেস" এবং "পরিবর্তন করুন" সময়গুলি পরিবর্তন করুন।


1
আপনি যদি মাইটাইম সম্পর্কে চিন্তা না করেন তবে আপনি ব্যবহার করতে পারেন >>/Scripts/file.txt। এটি যুক্ত করার জন্য ফাইলটি খুলবে এবং এটি উপস্থিত না থাকলে এটি তৈরি করবে।
কোজিরো

30

আপনি ত্রুটি পেয়ে যাচ্ছেন কারণ [এবং এর মধ্যে কোনও স্থান নেই! তবে আপনার কোডে কিছু ত্রুটি রয়েছে। প্রথমে আপনি যাচাই করে নিচ্ছেন যে ফাইলটির অস্তিত্ব নেই এবং না থাকলে আপনি কিছু করছেন না। ফাইলটি উপস্থিত থাকলে আপনি একটি ডিরেক্টরি তৈরি করছেন (তবে ফাইলটি তৈরি করতে কিছুই করছেন না)।

আপনার নাল অপারেশনও দরকার নেই, আপনার সহজভাবে এটি করতে সক্ষম হওয়া উচিত:

#! /bin/bash -
if [[ ! -e /Scripts/file.txt ]]; then
    mkdir -p /Scripts
    touch /Scripts/file.txt
fi

[command2]

এটি যাচাই করছে যে /Scripts/file.txtএটি বিদ্যমান নেই কিনা এটি /Scriptsডিরেক্টরি এবং তারপরে file.txtফাইলটি তৈরি করবে । আপনি চাইলে ডিরেক্টরিটির অস্তিত্ব আলাদাভাবেও পরীক্ষা করতে পারেন। অতিরিক্ত নোটিশ আপনি -eপরিবর্তে -fএকটি ফাইলের অস্তিত্ব যাচাই করতে বলেছিলেন সেটির পরিবর্তে আমি ব্যবহার করছি -eযেখানে -fএটি একটি "নিয়মিত ফাইল" http://tldp.org/LDP/abs/html/fto যাচাই করবে what এইচটিএমএল


ধন্যবাদ @ রাইমা, আমি আপনার পরামর্শটি দিয়ে আমার উত্তর আপডেট করেছি।
জেসি_বি

ফাইলটি কি নেই তবে ডিরেক্টরিটি কী নেই?
পিঁপড়া

3
@ অ্যান্ট: এমকেডির-পি: ইতিমধ্যে উপস্থিত থাকলে অভিযোগ না করে সমস্ত প্রয়োজনীয় ডিরেক্টরি তৈরি করুন। উদাহরণস্বরূপ: mkdir / home / user1 / tmp: এই শ্রেণিবদ্ধ তৈরি করবে, / home, বা / home / user1 এর ডিরেক্টরি থেকে স্বতন্ত্র, ডিরেক্টরিগুলি আগে থেকেই ছিল। স্পর্শটি কেবল একটি বিদ্যমান ফাইলের সময় আপডেট করবে বা কোনও ফাইল উপস্থিত না থাকলে একটি নতুন তৈরি করবে। এমনকি যদি একটি ... এমনকি অংশটি থেকে মুক্তি পেতে পারে তবে ঠিক এই 2 কমান্ডগুলি চালু করা ঠিক আছে, আপনি যদি নিশ্চিত করতে চান যে ডিরেক্টরিগুলি বিদ্যমান রয়েছে এবং সেই ফাইলটি এর মধ্যে রয়েছে।
অলিভিয়ার ডুলাক

আমি দেখি! স্পষ্টতার জন্য আপনাকে ধন্যবাদ :)
এন্ট

11

সঙ্গে, আরম্ভ করার জন্য শেল স্ক্রিপ্ট নয় ব্যাশ স্ক্রিপ্ট , তাই এর আপনার কোড আরো সাধারণ করি:

#!/bin/sh

প্রতিটি পজিক্স সিস্টেমে অবশ্যই সেই ফাইল থাকতে হবে; বাশ কঠোরভাবে alচ্ছিক।

ডিরেক্টরি উপস্থিত থাকলে তা পরীক্ষা করার দরকার নেই, ঠিক

dir=/Scripts
mkdir -p $dir

ফাইলটি উপস্থিত না থাকলে তা তৈরি করতে,

filename=$dir/file.txt
test -f $filename || touch $filename

বা আপনি যদি পছন্দ করেন,

filename=$dir/file.txt
if [ ! -f $filename ]
then
    touch $filename
fi

6

আপনার একটি সিনট্যাক্টিকাল ত্রুটি রয়েছে। আপনি শূণ্যস্থান আগে ও পরে প্রয়োজন [এবং ]


3
#!/bin/bash

# Check for the file that gets created when the script successfully finishes.
CHECKFILE="/Scripts/file.txt"

CHECKDIR=$( dirname "$CHECKFILE" )

# The directory with the file must exist
mkdir -p "$CHECKDIR"
if [ ! -f "$CHECKFILE" ]; then
    # What to do if the file is not there
fi
touch "$CHECKFILE"

উপরে অনুমান যেমন একটি তৈরি হিসাবে না "ঠাট" আছে ডিরেক্টরি নামক /Scripts/file.txtযা ( পারা স্ক্রিপ্ট অত্যাচার সবসময় যদি শাখা লেখে সেখানে একটি উপায় হতে)। যদি "ফাইল" ডিরেক্টরি হয় তবে -f পরীক্ষাটি ব্যর্থ হবে এবং টাচ কমান্ড কিছুই পরিবর্তন করবে না।


0

আমার পদ্ধতির

#!/bin/sh

# input might contains spaces and other characters
FILEPATH="/tmp/some where/the file.blah"

# extract the file + dir names
FILE="`basename "${FILEPATH}"`"
DIR="`dirname "${FILEPATH}"`"

# create the dir, then the file
mkdir -p "${DIR}" && touch "${DIR}/${FILE}"

# show result
ls -l "$FILEPATH"

আউটপুট

  ./dofile.sh
  -rw-r--r-- 1 jmullee jmullee 0 Nov 15 21:23 /tmp/some where/the file.blah


1
ফাইলটি উপস্থিত রয়েছে কিনা তা আপনি পরীক্ষা করছেন না
পাইডপাইপার

@ পিপিডিপিপার তিনি করেন, এটি জড়িত touchএবংmkdir -p
xenoid

আরও চেকিংয়ের সাথে একই আইডিস দেখতে: ডি = / বুট / বার্ক; এফ = fnord; mkdir -p "$ D" && {টাচ "$ ডি / $ এফ" && প্রতিধ্বনি "তৈরি $ ডি / $ এফ ওকে"; } || cho প্রতিধ্বনি "দির 'create ডি' তৈরি করতে পারেনি; }
jmullee
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.